In this notebook, we create figures for Studies 1-4.

source("./scripts_general/dependencies.R")
source("./scripts_general/custom_funs.R")
source("./scripts_general/var_recode_contrast.R")
source("./study1/scripts_s1/s1_var_groups.R")
source("./study2/scripts_s2/s2_var_groups.R")
source("./study3/scripts_s3/s3_var_groups.R")
source("./study4/scripts_s4/s4_var_groups.R")
setwd("./study1/analysis/")
The working directory was changed to /Users/anthrouser/Documents/Projects/Mind and Spirit overview paper/mindspiritquant/study1/analysis inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
source("../../scripts_general/data_load.R")
Parsed with column specification:
cols(
  .default = col_double(),
  study = col_character(),
  date = col_date(format = ""),
  researcher = col_character(),
  country = col_character(),
  site = col_character(),
  religion = col_character(),
  subject_gender = col_character(),
  subject_job = col_character(),
  subject_schedule = col_character(),
  subject_livedhere = col_character(),
  subject_lang = col_character(),
  subject_marital = col_character(),
  subject_hs = col_character(),
  subject_liveswith = col_character(),
  servicesperweek = col_character()
)
See spec(...) for full column specifications.
Parsed with column specification:
cols(
  .default = col_double(),
  study = col_character(),
  date = col_date(format = ""),
  researcher = col_character(),
  country = col_character(),
  site = col_character(),
  religion = col_character(),
  subject_gender = col_character(),
  subject_job = col_character(),
  subject_schedule = col_character(),
  subject_livedhere = col_character(),
  subject_lang = col_character(),
  subject_marital = col_character(),
  subject_hs = col_character(),
  subject_liveswith = col_character(),
  servicesperweek = col_character()
)
See spec(...) for full column specifications.
Parsed with column specification:
cols(
  .default = col_double(),
  ctry = col_character(),
  wher = col_character(),
  recr = col_character(),
  whoc = col_character(),
  demo_chur = col_character(),
  demo_ethn = col_character(),
  demo_maj = col_character(),
  demo_pocc = col_character(),
  demo_rlgn = col_character(),
  demo_sex = col_character()
)
See spec(...) for full column specifications.
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  .default = col_character(),
  X1 = col_double(),
  epi_subj = col_double(),
  epi_demo_age = col_double(),
  epi_demo_ses_num = col_double(),
  epi_demo_howr_num = col_double(),
  epi_demo_affr_num = col_double(),
  epi_demo_tung_num = col_double(),
  epi_demo_ytng_num = col_double(),
  epi_demo_affr_cat = col_logical(),
  epi_demo_tung_cat = col_logical(),
  epi_demo_ytng_cat = col_logical(),
  epi_version = col_double(),
  epi_charc = col_double()
)
See spec(...) for full column specifications.
2 parsing failures.
 row       col expected  actual                           file
1025 epi_charc a double Unclear '../../study3/data/d_demo.csv'
1027 epi_charc a double Unclear '../../study3/data/d_demo.csv'
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  score = col_double()
)
Joining, by = c("epi_ctry", "epi_subj")
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  score = col_double()
)
Joining, by = c("epi_ctry", "epi_subj")
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  question = col_character(),
  response = col_double(),
  order = col_double(),
  question_text = col_character()
)
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  question = col_character(),
  response = col_double(),
  order = col_double(),
  question_text = col_character()
)
Joining, by = c("epi_ctry", "epi_subj", "question", "response", "order", "question_text")
Joining, by = c("epi_ctry", "epi_subj")
Column `epi_ctry` joining character vector and factor, coercing into character vectorJoining, by = "epi_subj"
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  .default = col_double(),
  p7_ctry = col_character(),
  p7_abs_check = col_character(),
  p7_dse_check = col_character(),
  p7_se_check = col_character(),
  p7_unev_check = col_character(),
  p7_exsen_check = col_character(),
  p7_por_check = col_character(),
  p7_mm_check = col_character(),
  p7_dem_sex = col_character(),
  p7_dem_pocc = col_character(),
  p7_dem_major = col_character(),
  p7_dem_ethnicity = col_character(),
  p7_dem_rur.urb = col_character(),
  p7_dem_affrd.basics = col_character(),
  p7_dem_religion = col_character(),
  p7_dem_church = col_character(),
  p7_dem_holy.tung.gif = col_character(),
  p7_abs_child.exp_cat = col_logical(),
  p7_abs_poetic_cat = col_logical(),
  p7_abs_tv.real_cat = col_logical()
  # ... with 162 more columns
)
See spec(...) for full column specifications.
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("study", "p7_ctry", "p7_subj", "abs_score", "cog_score", "ctl_score", "dse_score", "hall_score", "para_score", "por_score", "pv_score", "spev_score")
Joining, by = c("study", "p7_ctry", "p7_subj", "abs_score", "cog_score", "ctl_score", "dse_score", "hall_score", "para_score", "por_score", "pv_score", "spev_score")
rsq_fun <- function(reg){
  reg_class <- class(reg)
  res <- rsquared(reg)
  
  if (grepl("lmerMod", reg_class)) {
    rsq <- res$Conditional
  } else {
    rsq <- res$R.squared
  }
  return(rsq)
}
d_all <- d1 %>%
  select(study, country, site, religion, subject_id, 
         pv_score, abs_score, spev_score) %>%
  mutate(religion = recode_factor(religion,
                                  "local" = "Local Religion",
                                  "charismatic" = "Charismatic Christianity"),
         # rescale to 0-1
         pv_score = pv_score/3) %>%
  full_join(d2 %>% 
              select(study, country, subj, 
                     abs_score, spev_score, dse_score) %>% 
              rename(subject_id = subj) %>%
              # rescale to 0-1
              mutate(spev_score = spev_score/4,
                     dse_score = dse_score/5,
                     religion = "General Population")) %>%
  full_join(d3 %>% 
              select(study, epi_ctry, epi_sample, epi_subj, 
                     por_score, spirit_score) %>%
              rename(country = epi_ctry, 
                     religion = epi_sample,
                     subject_id = epi_subj,
                     spev_score = spirit_score) %>%
              mutate(religion = recode_factor(religion,
                                              "general population" = "General Population",
                                              "charismatic" = "Charismatic Christianity"))) %>%
  full_join(d4 %>%
              select(study, p7_ctry, p7_subj, 
                     por_score, pv_score, abs_score, spev_score, dse_score) %>%
              rename(country = p7_ctry,
                     subject_id = p7_subj) %>%
              # rescale to 0-1
              mutate(por_score = por_score/2,
                     pv_score = pv_score/3,
                     spev_score = spev_score/4,
                     dse_score = dse_score/5,
                     religion = "General Population")) %>%
  mutate(religion = factor(religion, 
                           levels = c("General Population", 
                                      "Local Religion",
                                      "Charismatic Christianity")),
         study = gsub("study", "Study", study)) 
Joining, by = c("study", "country", "religion", "subject_id", "abs_score", "spev_score")
Column `religion` joining factor and character vector, coercing into character vectorJoining, by = c("study", "country", "religion", "subject_id", "spev_score")
Column `religion` joining character vector and factor, coercing into character vectorJoining, by = c("study", "country", "religion", "subject_id", "pv_score", "abs_score", "spev_score", "dse_score", "por_score")

Summary statistics

By study

Study 4

d_sum_s1 <- d_all %>%
  filter(study == "Study 1") %>%
  group_by(country, religion, site) %>%
  summarise_at(vars(spev_score, pv_score, abs_score),
               funs(mean = mean(., na.rm = T), sd = sd(., na.rm = T))) %>%
  ungroup()
d_rsq_s1 <- data.frame(
  var = c("spev_score", "pv_score", "abs_score"),
  rsq_fix = c(rsq_fun(lm(spev_score ~ country, d_all %>% filter(study == "Study 1"))),
              rsq_fun(lm(pv_score ~ country, d_all %>% filter(study == "Study 1"))),
              rsq_fun(lm(abs_score ~ country, d_all %>% filter(study == "Study 1")))),
  rsq_ran = c(rsq_fun(lmer(spev_score ~ 1 + (1 | country), 
                         d_all %>% filter(study == "Study 1"))),
              rsq_fun(lmer(pv_score ~ 1 + (1 | country), 
                         d_all %>% filter(study == "Study 1"))),
              rsq_fun(lmer(abs_score ~ 1 + (1 | country), 
                         d_all %>% filter(study == "Study 1")))))
d_rsq_s1
plot_s1_spev <- d_all %>% # XX BOOKMARK
  filter(study == "Study 1") %>%
  ggplot(aes(x = country, y = spev_score, 
             color = country, fill = country, 
             shape = site)) +
  facet_grid(~ religion) +
  geom_point(position = position_jitterdodge(jitter.width = 0.25,
                                             jitter.height = 0,
                                             dodge.width = 0.5), 
             alpha = 0.25, show.legend = F) +
  geom_pointrange(data = . %>%
                    group_by(country, religion, site) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  position = position_dodge(width = 0.5),
                  color = "black") +
  geom_text(data = d_sum_s1 %>%
              mutate_at(vars(-country, -religion, -site), 
                        funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(spev_score_mean, "\n(", spev_score_sd, ")")),
                  position = position_dodge(width = 0.75),
            color = "black", size = 2.5, vjust = 1) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_shape_manual(values = 21:24) +
  scale_y_continuous(limits = c(NA, 1), breaks = seq(0, 1, 0.25)) +
  theme(legend.position = "bottom") +
  guides(color = F, fill = F, 
         shape = guide_legend(override.aes = list(fill = "black"))) +
  labs(x = "Country", y = "Spiritual Events", shape = "Site")
fig_0_title <- ggdraw() + 
  draw_label("STUDY 1", fontface = 'bold', x = 0, hjust = 0.5) +
  theme(plot.margin = margin(0, 0, 0, 35))

fig_0 <- plot_grid(
  fig_0_title,
  plot_grid(plot_s1_spev, 
            ncol = 1),
  ncol = 1, rel_heights = c(1, 20))
Removed 4 rows containing missing values (geom_point).
# fig_0
fig_0

Study 4

d_sum_s4 <- d_all %>%
  filter(study == "Study 4") %>%
  group_by(country) %>%
  summarise_at(vars(spev_score, dse_score, pv_score, por_score, abs_score),
               funs(mean = mean(., na.rm = T), sd = sd(., na.rm = T))) %>%
  ungroup()
d_rsq_s4 <- data.frame(
  var = c("spev_score", "dse_score", "pv_score", "por_score", "abs_score"),
  rsq_fix = c(rsq_fun(lm(spev_score ~ country, d_all %>% filter(study == "Study 4"))),
              rsq_fun(lm(dse_score ~ country, d_all %>% filter(study == "Study 4"))),
              rsq_fun(lm(pv_score ~ country, d_all %>% filter(study == "Study 4"))),
              rsq_fun(lm(por_score ~ country, d_all %>% filter(study == "Study 4"))),
              rsq_fun(lm(abs_score ~ country, d_all %>% filter(study == "Study 4")))),
  rsq_ran = c(rsq_fun(lmer(spev_score ~ 1 + (1 | country), 
                         d_all %>% filter(study == "Study 4"))),
              rsq_fun(lmer(dse_score ~ 1 + (1 | country), 
                         d_all %>% filter(study == "Study 4"))),
              rsq_fun(lmer(pv_score ~ 1 + (1 | country), 
                         d_all %>% filter(study == "Study 4"))),
              rsq_fun(lmer(por_score ~ 1 + (1 | country), 
                         d_all %>% filter(study == "Study 4"))),
              rsq_fun(lmer(abs_score ~ 1 + (1 | country), 
                         d_all %>% filter(study == "Study 4")))))
d_rsq_s4
plot_s4_spev <- d_all %>%
  filter(study == "Study 4") %>%
  ggplot(aes(x = country, y = spev_score, color = country, fill = country)) +
  geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(spev_score_mean, "\n(", spev_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_y_continuous(limits = c(NA, 1), breaks = seq(0, 1, 0.25)) +
  labs(x = "Country", y = "Spiritual Events")
plot_s4_dse <- d_all %>%
  filter(study == "Study 4") %>%
  ggplot(aes(x = country, y = dse_score, color = country, fill = country)) +
  geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(dse_score, na.rm = T),
                              sd = sd(dse_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(dse_score_mean, "\n(", dse_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_y_continuous(limits = c(NA, 1), breaks = seq(0, 1, 0.25)) +
  labs(x = "Country", y = "Daily Spiritual Experiences")
plot_s4_pv <- d_all %>%
  filter(study == "Study 4") %>%
  ggplot(aes(x = country, y = pv_score, color = country, fill = country)) +
  geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(pv_score, na.rm = T),
                              sd = sd(pv_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(pv_score_mean, "\n(", pv_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_y_continuous(limits = c(NA, 1), breaks = seq(0, 1, 0.25)) +
  labs(x = "Country", y = "Porosity Vignettes")
plot_s4_por <- d_all %>%
  filter(study == "Study 4") %>%
  ggplot(aes(x = country, y = por_score, color = country, fill = country)) +
  geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(por_score, na.rm = T),
                              sd = sd(por_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(por_score_mean, "\n(", por_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_y_continuous(limits = c(NA, 1), breaks = seq(0, 1, 0.25)) +
  labs(x = "Country", y = "Porosity Scale")
plot_s4_abs <- d_all %>%
  filter(study == "Study 4") %>%
  ggplot(aes(x = country, y = abs_score, color = country, fill = country)) +
  geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(abs_score, na.rm = T),
                              sd = sd(abs_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(abs_score_mean, "\n(", abs_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_y_continuous(limits = c(NA, 1), breaks = seq(0, 1, 0.25)) +
  labs(x = "Country", y = "Absorption")
fig_2_title <- ggdraw() + 
  draw_label("STUDY 4", fontface = 'bold', x = 0, hjust = 0.5) +
  theme(plot.margin = margin(0, 0, 0, 35))

fig_2 <- plot_grid(
  fig_2_title,
  plot_grid(plot_s4_spev, plot_s4_dse, 
            plot_s4_pv, plot_s4_por, 
            plot_s4_abs, NULL, 
            ncol = 2, labels = c("A", "B", "C", "D", "E")),
  ncol = 1, rel_heights = c(1, 20))
Removed 2 rows containing missing values (geom_point).
# fig_2
fig_2

Spiritual Events scores

Study 1

d1 %>%
  ggplot(aes(x = country, y = spev_score, color = country, fill = country)) +
  geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_y_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.25)) +
  labs(x = "Country", y = "Study 1: Spiritual Events score (range: 0-1)",
       caption = "Error bars are ±1 standard deviation from the mean")

d_all %>%
  filter(study == "Study 1") %>%
  ggplot(aes(x = country, y = spev_score, color = country, fill = country)) +
  geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
  geom_pointrange(data = . %>%
                    group_by(country, religion) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd,
                      shape = religion),
                  color = "black",
                  show.legend = T) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_shape_manual(values = 21:24) +
  scale_y_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.25)) +
  guides(color = F, fill = F, 
         shape = guide_legend(override.aes = list(fill = "black"))) +
  labs(x = "Country", y = "Study 1: Spiritual Events score (range: 0-1)",
       caption = "Error bars are ±1 standard deviation from the mean")

Study 2

d2 %>%
  ggplot(aes(x = country, y = spev_score, color = country, fill = country)) +
  geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_y_continuous(limits = c(NA, 4), breaks = seq(0, 4, 1)) +
  labs(x = "Country", y = "Study 2: Spiritual Events score (range: 0-4)",
       caption = "Error bars are ±1 standard deviation from the mean")

Study 3

d3 %>%
  # correct for scaling in original dataset
  mutate(spev_score = spirit_score * 4) %>%
  ggplot(aes(x = epi_ctry, y = spev_score, color = epi_ctry, fill = epi_ctry)) +
  geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
  geom_pointrange(data = . %>%
                    group_by(epi_ctry) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_y_continuous(limits = c(NA, 4), breaks = seq(0, 4, 1)) +
  labs(x = "Country", y = "Study 3: Spiritual Events score (range: 0-4)",
       caption = "Error bars are ±1 standard deviation from the mean")

Study 4

d4 %>%
  ggplot(aes(x = p7_ctry, y = spev_score, color = p7_ctry, fill = p7_ctry)) +
  geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
  geom_pointrange(data = . %>%
                    group_by(p7_ctry) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_y_continuous(limits = c(NA, 4), breaks = seq(0, 4, 1)) +
  labs(x = "Country", y = "Study 4: Spiritual Events score (range: 0-4)",
       caption = "Error bars are ±1 standard deviation from the mean")

All studies

d_all %>%
  ggplot(aes(x = country, y = spev_score, color = country, fill = country,
             group = study)) +
  geom_point(position = position_jitterdodge(jitter.width = 0.25,
                                             jitter.height = 0,
                                             dodge.width = 0.75), 
             alpha = 0.1) +
  geom_pointrange(data = d_all %>%
                    group_by(study, country) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd, shape = study), 
                  position = position_dodge(width = 0.75),
                  color = "black") +
  scale_shape_manual(values = 21:24) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  guides(color = F, fill = F, 
         shape = guide_legend(override.aes = list(fill = "black"))) +
  theme(legend.position = "bottom") +
  labs(x = "Country", y = "Spiritual Events score (rescaled to 0-1)",
       shape = "Study", 
       caption = "Error bars are ±1 standard deviation from the mean")

d_spev_sum <- d_all %>%
  filter(!is.na(spev_score)) %>%
  group_by(study, country, religion) %>%
  summarise(mean = mean(spev_score, na.rm = T),
            sd = sd(spev_score, na.rm = T),
            n = n()) %>%
  ungroup()
d_all %>%
  ggplot(aes(x = country, y = spev_score, 
             color = country, fill = country,
             group = religion)) +
  facet_grid(~ study, scales = "free", space = "free") +
  geom_point(position = position_jitterdodge(jitter.width = 0.8,
                                             jitter.height = 0.02,
                                             dodge.width = 0.75), 
             alpha = 0.15) +
  geom_pointrange(data = d_spev_sum,
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd, 
                      shape = religion), 
                  position = position_dodge(width = 0.75),
                  fill = "black",
                  color = "black") +
  geom_text(data = d_spev_sum %>%
              mutate(ypos = case_when(
                grepl("charismatic", tolower(religion)) ~ mean + sd + 0.05,
                TRUE ~ mean - sd - 0.05)),
            aes(y = ypos, label = paste0("n=", n)), 
            position = position_dodge(width = 0.75),
            size = 3, color = "black") +
  scale_shape_manual(values = 21:24) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  guides(color = F, fill = F, 
         shape = guide_legend(override.aes = list(fill = "black"))) +
  theme(legend.position = "bottom",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(x = "Country", y = "Spiritual Events score (rescaled to 0-1)",
       # caption = "Error bars are ±1 standard deviation from the mean",
       shape = "Religion")

d_all %>%
  filter(study == "Study 1") %>%
  ggplot(aes(x = country, y = spev_score, 
             color = country, fill = country,
             group = religion)) +
  geom_point(position = position_jitterdodge(jitter.width = 0.8,
                                             jitter.height = 0.02,
                                             dodge.width = 0.75), 
             alpha = 0.15) +
  geom_pointrange(data = d_spev_sum %>%
                    filter(study == "Study 1"),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd, 
                      shape = religion), 
                  position = position_dodge(width = 0.75),
                  fill = "black",
                  color = "black") +
  geom_text(data = d_spev_sum %>%
              filter(study == "Study 1") %>%
              mutate(ypos = case_when(
                grepl("charismatic", tolower(religion)) ~ mean + sd + 0.05,
                TRUE ~ mean - sd - 0.05)),
            aes(y = ypos, label = paste0("n=", n)), 
            position = position_dodge(width = 0.75),
            size = 3, color = "black") +
  scale_shape_manual(values = 21:24) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  guides(color = F, fill = F, 
         shape = guide_legend(override.aes = list(fill = "black"))) +
  theme(legend.position = "bottom") +
  labs(x = "Country", y = "Spiritual Events score (rescaled to 0-1)",
       # caption = "Error bars are ±1 standard deviation from the mean",
       shape = "Religion")

Porosity scores

d_por_sum <- d_all %>%
  gather(por_scale, por_score, c(pv_score, por_score)) %>%
  mutate(por_scale = recode(por_scale,
                            "pv_score" = "Porosity Vignettes",
                            "por_score" = "Porosity Scale")) %>%
  filter(!is.na(por_score)) %>%
  group_by(study, country, religion, por_scale) %>%
  summarise(mean = mean(por_score, na.rm = T),
            sd = sd(por_score, na.rm = T),
            n = n()) %>%
  ungroup()
Factor `religion` contains implicit NA, consider using `forcats::fct_explicit_na`
d_all %>% 
  gather(por_scale, por_score, c(pv_score, por_score)) %>%
  mutate(por_scale = recode(por_scale,
                            "pv_score" = "Porosity Vignettes",
                            "por_score" = "Porosity Scale")) %>%
  filter(!is.na(por_score)) %>%
  ggplot(aes(x = country, y = por_score, 
             color = country, fill = country,
             group = religion)) +
  facet_grid(cols = vars(study, por_scale), scales = "free", space = "free") +
  geom_point(position = position_jitterdodge(jitter.width = 0.8,
                                             jitter.height = 0.02,
                                             dodge.width = 0.75), 
             alpha = 0.15) +
  geom_pointrange(data = d_por_sum,
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd, 
                      shape = religion), 
                  position = position_dodge(width = 0.75),
                  fill = "black",
                  color = "black") +
  geom_text(data = d_por_sum %>%
              mutate(ypos = case_when(
                grepl("charismatic", tolower(religion)) ~ mean + sd + 0.05,
                TRUE ~ mean - sd - 0.05)),
            aes(y = ypos, label = paste0("n=", n)), 
            position = position_dodge(width = 0.75),
            size = 3, color = "black") +
  scale_shape_manual(values = 21:24) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  guides(color = F, fill = F, 
         shape = guide_legend(override.aes = list(fill = "black"))) +
  theme(legend.position = "bottom",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(x = "Country", y = "Porosity score (rescaled to 0-1)",
       # caption = "Error bars are ±1 standard deviation from the mean",
       shape = "Religion")

Absorption scores

d_abs_sum <- d_all %>%
  filter(!is.na(abs_score)) %>%
  group_by(study, country, religion) %>%
  summarise(mean = mean(abs_score, na.rm = T),
            sd = sd(abs_score, na.rm = T),
            n = n()) %>%
  ungroup()
Factor `religion` contains implicit NA, consider using `forcats::fct_explicit_na`
d_all %>% 
  filter(!is.na(abs_score)) %>%
  ggplot(aes(x = country, y = abs_score, 
             color = country, fill = country,
             group = religion)) +
  facet_grid(. ~ study, scales = "free", space = "free") +
  geom_point(position = position_jitterdodge(jitter.width = 0.8,
                                             jitter.height = 0.02,
                                             dodge.width = 0.75), 
             alpha = 0.15) +
  geom_pointrange(data = d_abs_sum,
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd, 
                      shape = religion), 
                  position = position_dodge(width = 0.75),
                  fill = "black",
                  color = "black") +
  geom_text(data = d_abs_sum %>%
              mutate(ypos = case_when(
                grepl("charismatic", tolower(religion)) ~ mean + sd + 0.05,
                TRUE ~ mean - sd - 0.05)),
            aes(y = ypos, label = paste0("n=", n)), 
            position = position_dodge(width = 0.75),
            size = 3, color = "black") +
  scale_shape_manual(values = 21:24) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  guides(color = F, fill = F, 
         shape = guide_legend(override.aes = list(fill = "black"))) +
  theme(legend.position = "bottom",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(x = "Country", y = "Absorption score (rescaled to 0-1)",
       # caption = "Error bars are ±1 standard deviation from the mean",
       shape = "Religion")

r1_spev <- lm(spev_score_std ~ country, d1)
r1_pv <- lm(pv_score_std ~ country, d1)
r1_abs <- lm(abs_score_std ~ country, d1)

r2_spev <- lm(spev_score_std ~ country, d2)
r2_dse <- lm(dse_score_std ~ country, d2)
r2_abs <- lm(abs_score_std ~ country, d2)

r3_spev <- lm(spirit_score_std ~ epi_ctry, d3)
r3_por <- lm(por_score_std ~ epi_ctry, d3)

r4_spev <- lm(spev_score_std ~ p7_ctry, d4)
r4_dse <- lm(dse_score_std ~ p7_ctry, d4)
r4_por <- lm(por_score_std ~ p7_ctry, d4)
r4_pv <- lm(pv_score_std ~ p7_ctry, d4)
r4_abs <- lm(abs_score_std ~ p7_ctry, d4)
df1 <- data.frame(study = "study 1",
                  var = c("spiritual experience", "porosity", "absorption"),
                  scale = c("spiritual events", "porosity vignettes", "absorption"),
                  rsq = c(rsquared(r1_spev)$R.squared, 
                          rsquared(r1_pv)$R.squared, 
                          rsquared(r1_abs)$R.squared))

df2 <- data.frame(study = "study 3",
                  var = c("spiritual experience", "spiritual experience", "absorption"),
                  scale = c("spiritual events", "DSE", "absorption"),
                  rsq = c(rsquared(r2_spev)$R.squared, 
                          rsquared(r2_dse)$R.squared, 
                          rsquared(r2_abs)$R.squared))

df3 <- data.frame(study = "study 2",
                  var = c("spiritual experience", "porosity"),
                  scale = c("spiritual events", "porosity scale"),
                  rsq = c(rsquared(r3_spev)$R.squared, 
                          rsquared(r3_por)$R.squared))

df4 <- data.frame(study = "study 4",
                  var = c("spiritual experience", "spiritual experience", 
                          "porosity", "porosity", "absorption"),
                  scale = c("spiritual events", "DSE", 
                            "porosity scale", "porosity vignettes", "absorption"),
                  rsq = c(rsquared(r4_spev)$R.squared, 
                          rsquared(r4_dse)$R.squared,
                          rsquared(r4_por)$R.squared, 
                          rsquared(r4_pv)$R.squared, 
                          rsquared(r4_abs)$R.squared))

df_all <- full_join(df1, df2) %>% full_join(df3) %>% full_join(df4) %>%
  mutate(var = factor(var, 
                      levels = c("spiritual experience", 
                                 "porosity", "absorption"))) %>%
  select(var, scale, study, rsq) %>%
  arrange(var, scale, study)
Joining, by = c("study", "var", "scale", "rsq")
Column `study` joining factors with different levels, coercing to character vectorColumn `var` joining factors with different levels, coercing to character vectorColumn `scale` joining factors with different levels, coercing to character vectorJoining, by = c("study", "var", "scale", "rsq")
Column `study` joining character vector and factor, coercing into character vectorColumn `var` joining character vector and factor, coercing into character vectorColumn `scale` joining character vector and factor, coercing into character vectorJoining, by = c("study", "var", "scale", "rsq")
Column `study` joining character vector and factor, coercing into character vectorColumn `var` joining character vector and factor, coercing into character vectorColumn `scale` joining character vector and factor, coercing into character vector
df_all %>% 
  mutate(percent_exp = paste0(round(rsq * 100), "%")) %>%
  select(-rsq) %>%
  spread(study, percent_exp) %>%
  mutate_at(vars(starts_with("study")),
            funs(case_when(is.na(.) ~ ".", 
                           TRUE ~ .))) %>%
  kable() %>% 
  kable_styling() %>%
  collapse_rows(1:3)
var scale study 1 study 2 study 3 study 4
spiritual experience DSE . . 50% 50%
spiritual events 22% 24% 38% 31%
porosity porosity scale . 61% . 39%
porosity vignettes 37% . . 27%
absorption absorption 10% . 11% 9%
r1_spev_pv <- lm(spev_score_std ~ pv_score_std, d1)
r1_spev_abs <- lm(spev_score_std ~ abs_score_std, d1)

r2_spev_abs <- lm(spev_score_std ~ abs_score_std, d2)
r2_dse_abs <- lm(dse_score_std ~ abs_score_std, d2)

r3_spev_por <- lm(spirit_score_std ~ por_score_std, d3)

r4_spev_por <- lm(spev_score_std ~ por_score_std, d4)
r4_dse_por <- lm(dse_score_std ~ por_score_std, d4)
r4_spev_pv <- lm(spev_score_std ~ pv_score_std, d4)
r4_dse_pv <- lm(dse_score_std ~ pv_score_std, d4)
r4_spev_abs <- lm(spev_score_std ~ abs_score_std, d4)
r4_dse_abs <- lm(dse_score_std ~ abs_score_std, d4)
df1b <- data.frame(study = "study 1",
                   outcome = "spiritual events",
                   predictor = c("porosity vignettes", "absorption"),
                   rsq = c(rsquared(r1_spev_pv)$R.squared, 
                           rsquared(r1_spev_abs)$R.squared))

df2b <- data.frame(study = "study 3",
                   outcome = c("spiritual events", "DSE"),
                   predictor = "absorption",
                   rsq = c(rsquared(r2_spev_abs)$R.squared, 
                           rsquared(r2_dse_abs)$R.squared))

df3b <- data.frame(study = "study 2",
                   outcome = "spiritual events",
                   predictor = "porosity scale",
                   rsq = c(rsquared(r3_spev_por)$R.squared))

df4b <- data.frame(study = "study 4",
                   outcome = rep(c("spiritual events", "DSE"), 3),
                   predictor = c(rep("porosity scale", 2), 
                                 rep("porosity vignettes", 2),
                                 rep("absorption", 2)),
                   rsq = c(rsquared(r4_spev_por)$R.squared, 
                           rsquared(r4_dse_por)$R.squared,
                           rsquared(r4_spev_pv)$R.squared, 
                           rsquared(r4_dse_pv)$R.squared, 
                           rsquared(r4_spev_abs)$R.squared,
                           rsquared(r4_dse_abs)$R.squared))

df_allb <- full_join(df1b, df2b) %>% full_join(df3b) %>% full_join(df4b) %>%
  mutate(outcome = factor(outcome,
                          levels = c("spiritual events", "DSE")),
         predictor = factor(predictor,
                            levels = c("porosity vignettes", "porosity scale", "absorption"))) %>%
  select(predictor, outcome, study, rsq) %>%
  arrange(predictor, outcome, study)
Joining, by = c("study", "outcome", "predictor", "rsq")
Column `study` joining factors with different levels, coercing to character vectorColumn `outcome` joining factors with different levels, coercing to character vectorColumn `predictor` joining factors with different levels, coercing to character vectorJoining, by = c("study", "outcome", "predictor", "rsq")
Column `study` joining character vector and factor, coercing into character vectorColumn `outcome` joining character vector and factor, coercing into character vectorColumn `predictor` joining character vector and factor, coercing into character vectorJoining, by = c("study", "outcome", "predictor", "rsq")
Column `study` joining character vector and factor, coercing into character vectorColumn `outcome` joining character vector and factor, coercing into character vectorColumn `predictor` joining character vector and factor, coercing into character vector
df_allb %>% 
  full_join(df_all %>% 
              filter(var == "spiritual experience") %>%
              select(-var) %>%
              rename(outcome = scale) %>%
              mutate(predictor = "country")) %>%
  mutate(predictor = factor(predictor,
                            levels = c("country", "porosity vignettes",
                                       "porosity scale", "absorption"))) %>%
  mutate(percent_exp = paste0(round(rsq * 100), "%")) %>%
  select(-rsq) %>%
  spread(study, percent_exp) %>%
  mutate_at(vars(starts_with("study")),
            funs(case_when(is.na(.) ~ ".", 
                           TRUE ~ .))) %>%
  kable() %>% 
  kable_styling() %>%
  collapse_rows(1:2)
Joining, by = c("predictor", "outcome", "study", "rsq")
Column `predictor` joining factor and character vector, coercing into character vectorColumn `outcome` joining factor and character vector, coercing into character vector
predictor outcome study 1 study 2 study 3 study 4
country DSE . . 50% 50%
spiritual events 22% 24% 38% 31%
porosity vignettes DSE . . . 28%
spiritual events 13% . . 29%
porosity scale DSE . . . 44%
spiritual events . 39% . 33%
absorption DSE . . 3% 2%
spiritual events 11% . 12% 8%

Relationships

All studies, multipart plot

Spiritual Events only, cowplot

fig_s1_por <- d_all %>%
  filter(study == "Study 1") %>%
  ggplot(aes(x = pv_score, y = spev_score)) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  xlim(0, 1) +
  ylim(0, 1) +
  theme(legend.position = "none") +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Porosity Vignettes",
       y = "Spiritual Events",
       color = "Country")
# fig_s1_por

fig_s1_abs <- d_all %>%
  filter(study == "Study 1") %>%
  ggplot(aes(x = abs_score, y = spev_score)) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  xlim(0, 1) +
  ylim(0, 1) +
  theme(legend.position = "none") +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Absorption",
       y = "Spiritual Events",
       color = "Country")
# fig_s1_abs
fig_s1_title <- ggdraw() + 
  draw_label("STUDY 1", fontface = 'bold', x = 0, hjust = 0.5) +
  theme(plot.margin = margin(0, 0, 0, 105))

fig_s1 <- plot_grid(
  fig_s1_title,
  plot_grid(fig_s1_por, fig_s1_abs, ncol = 1, labels = c("A", "B")),
  ncol = 1, rel_heights = c(1, 10))
Removed 20 rows containing non-finite values (stat_smooth).Removed 20 rows containing non-finite values (stat_smooth).Removed 20 rows containing missing values (geom_point).Removed 28 rows containing non-finite values (stat_smooth).Removed 28 rows containing non-finite values (stat_smooth).Removed 28 rows containing missing values (geom_point).
# fig_s1
fig_s1_title_vert <- ggdraw() + 
  draw_label("STUDY 1", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

fig_s1_vert <- plot_grid(
  fig_s1_title_vert,
  plot_grid(fig_s1_por, fig_s1_abs, ncol = 2, labels = c("A", "B")),
  ncol = 1, rel_heights = c(1, 10))
Removed 20 rows containing non-finite values (stat_smooth).Removed 20 rows containing non-finite values (stat_smooth).Removed 20 rows containing missing values (geom_point).Removed 28 rows containing non-finite values (stat_smooth).Removed 28 rows containing non-finite values (stat_smooth).Removed 28 rows containing missing values (geom_point).
# fig_s1_vert
fig_s2_abs <- d_all %>%
  filter(study == "Study 2") %>%
  ggplot(aes(x = abs_score, y = spev_score)) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  xlim(0, 1) +
  ylim(0, 1) +
  theme(legend.position = "none") +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Absorption",
       y = "Spiritual Events",
       color = "Country")
# fig_s2_abs
fig_s2_title <- ggdraw() + 
  draw_label("STUDY 3", fontface = 'bold', x = 0, hjust = 0.5) +
  theme(plot.margin = margin(0, 0, 0, 105))

fig_s2 <- plot_grid(
  fig_s2_title,
  plot_grid(NULL, fig_s2_abs, ncol = 1, labels = c("", "C")),
  ncol = 1, rel_heights = c(1, 10))
Removed 10 rows containing missing values (geom_smooth).
# fig_s2
fig_s2_title_vert <- ggdraw() + 
  draw_label("STUDY 3", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

fig_s2_vert <- plot_grid(
  fig_s2_title_vert,
  plot_grid(NULL, fig_s2_abs, ncol = 2, labels = c("", "C")),
  ncol = 1, rel_heights = c(1, 10))
Removed 10 rows containing missing values (geom_smooth).
# fig_s2_vert
fig_s3_por <- d_all %>%
  filter(study == "Study 3") %>%
  ggplot(aes(x = por_score, y = spev_score)) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  xlim(0, 1) +
  ylim(0, 1) +
  theme(legend.position = "none") +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Porosity Scale",
       y = "Spiritual Events",
       color = "Country")
# fig_s3_por
fig_s3_title <- ggdraw() + 
  draw_label("STUDY 2", fontface = 'bold', x = 0, hjust = 0.5) +
  theme(plot.margin = margin(0, 0, 0, 105))

fig_s3 <- plot_grid(
  fig_s3_title,
  plot_grid(fig_s3_por, NULL, ncol = 1, labels = c("D", "")),
  ncol = 1, rel_heights = c(1, 10))
# fig_s3
fig_s3_title_vert <- ggdraw() + 
  draw_label("STUDY 2", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

fig_s3_vert <- plot_grid(
  fig_s3_title_vert,
  plot_grid(fig_s3_por, NULL, ncol = 2, labels = c("D", "")),
  ncol = 1, rel_heights = c(1, 10))
# fig_s3_vert
fig_s32_vert <- plot_grid(
  plot_grid(
    fig_s3_title_vert, 
    plot_grid(fig_s3_por, labels = c("C")), 
    ncol = 1, rel_heights = c(1, 10)),
  plot_grid(
    fig_s2_title_vert,
    plot_grid(fig_s2_abs, labels = c("D")), 
    ncol = 1, rel_heights = c(1, 10))
)
Removed 10 rows containing missing values (geom_smooth).
fig_s4_por1 <- d_all %>%
  filter(study == "Study 4") %>%
  ggplot(aes(x = pv_score, y = spev_score)) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  xlim(0, 1) +
  ylim(0, 1) +
  theme(legend.position = "none") +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Porosity Vignettes",
       y = "Spiritual Events",
       color = "Country")
# fig_s4_por1

fig_s4_por2 <- d_all %>%
  filter(study == "Study 4") %>%
  ggplot(aes(x = por_score, y = spev_score)) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  xlim(0, 1) +
  ylim(0, 1) +
  theme(legend.position = "none") +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Porosity Scale",
       y = "Spiritual Events",
       color = "Country")
# fig_s4_por2

fig_s4_abs <- d_all %>%
  filter(study == "Study 4") %>%
  ggplot(aes(x = abs_score, y = spev_score)) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  xlim(0, 1) +
  ylim(0, 1) +
  theme(legend.position = "none") +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Absorption",
       y = "Spiritual Events",
       color = "Country")
# fig_s4_abs
fig_s4_title <- ggdraw() + 
  draw_label("STUDY 4", fontface = 'bold', x = 0, hjust = 0.5) +
  theme(plot.margin = margin(0, 0, 0, 190))

fig_s4 <- plot_grid(
  fig_s4_title,
  plot_grid(plot_grid(fig_s4_por1, fig_s4_por2, ncol = 2, labels = c("E", "F")), 
            plot_grid(NULL, fig_s4_abs, NULL, ncol = 3, rel_widths = c(1, 2, 1), labels = c("", "G", "")), 
            ncol = 1),
  ncol = 1, rel_heights = c(1, 10))
Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing missing values (geom_point).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing missing values (geom_point).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing missing values (geom_point).Removed 11 rows containing missing values (geom_smooth).
# fig_s4
fig_s4_title_vert <- ggdraw() + 
  draw_label("STUDY 4", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

fig_s4_vert <- plot_grid(
  fig_s4_title_vert,
  plot_grid(plot_grid(fig_s4_por1, fig_s4_por2, ncol = 1, labels = c("E", "F")), 
            plot_grid(NULL, fig_s4_abs, NULL, ncol = 1, rel_heights = c(1, 2, 1), labels = c("", "G", "")), 
            ncol = 2),
  ncol = 1, rel_heights = c(1, 20))
Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing missing values (geom_point).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing missing values (geom_point).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing missing values (geom_point).Removed 11 rows containing missing values (geom_smooth).
# fig_s4_vert
fig_legend <- get_legend(fig_s4_por1 + theme(legend.position = "bottom"))
Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing missing values (geom_point).
fig_all <- plot_grid(fig_s1, fig_s2, fig_s3, fig_s4, ncol = 4,
                     rel_widths = c(1, 1, 1, 2), scale = 0.95)
fig_all

fig_all_vert <- plot_grid(fig_s1_vert, fig_s32_vert, fig_s4_vert, fig_legend,
                          ncol = 1, rel_heights = c(1, 1, 2, 0.2))
fig_all_vert

Daily Spiritual Experiences only, cowplot

fig_s2_abs <- d_all %>%
  filter(study == "Study 2") %>%
  ggplot(aes(x = abs_score, y = dse_score)) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  xlim(0, 1) +
  ylim(0, 1) +
  theme(legend.position = "none") +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Absorption",
       y = "Daily Spiritual Experiences",
       color = "Country")
# fig_s2_abs
fig_s2_title_vert <- ggdraw() + 
  draw_label("STUDY 3", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

fig_s2_vert <- plot_grid(
  fig_s2_title_vert,
  plot_grid(fig_s2_abs, ncol = 1, labels = "B"),
  ncol = 1, rel_heights = c(1, 10))
# fig_s2_vert
fig_s4_por1 <- d_all %>%
  filter(study == "Study 4") %>%
  ggplot(aes(x = pv_score, y = dse_score)) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  xlim(0, 1) +
  ylim(0, 1) +
  theme(legend.position = "none") +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Porosity Vignettes",
       y = "Daily Spiritual Experiences",
       color = "Country")
# fig_s4_por1

fig_s4_por2 <- d_all %>%
  filter(study == "Study 4") %>%
  ggplot(aes(x = por_score, y = dse_score)) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  xlim(0, 1) +
  ylim(0, 1) +
  theme(legend.position = "none") +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Porosity Scale",
       y = "Daily Spiritual Experiences",
       color = "Country")
# fig_s4_por2

fig_s4_abs <- d_all %>%
  filter(study == "Study 4") %>%
  ggplot(aes(x = abs_score, y = dse_score)) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  xlim(0, 1) +
  ylim(0, 1) +
  theme(legend.position = "none") +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Absorption",
       y = "Daily Spiritual Experiences",
       color = "Country")
# fig_s4_abs
fig_s4_title_vert <- ggdraw() + 
  draw_label("STUDY 4", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

fig_s4_por1_vert <- plot_grid(
  fig_s4_title_vert,
  plot_grid(fig_s4_por1, ncol = 1, labels = "A"),
  ncol = 1, rel_heights = c(1, 10))
# fig_s4_por1_vert

fig_s4_por2_vert <- plot_grid(
  fig_s4_title_vert,
  plot_grid(fig_s4_por2, ncol = 1, labels = "C"),
  ncol = 1, rel_heights = c(1, 10))
# fig_s4_por2_vert

fig_s4_abs_vert <- plot_grid(
  fig_s4_title_vert,
  plot_grid(fig_s4_abs, ncol = 1, labels = "D"),
  ncol = 1, rel_heights = c(1, 10))
# fig_s4_abs_vert
fig_legend <- get_legend(fig_s4_por1 + theme(legend.position = "bottom"))
fig_all_vert <- plot_grid(
  plot_grid(fig_s4_por1_vert, fig_s2_vert, 
            fig_s4_por2_vert, fig_s4_abs_vert,
            ncol = 2),
  fig_legend,
  ncol = 1, rel_heights = c(2, 0.2))
fig_all_vert

Other versions

Spiritual Events only, one grid, new layout

d_all %>%
  gather(spirit_scale, spev_score, c(spev_score, dse_score)) %>%
  gather(pred_scale, pred_score, c(por_score, pv_score, abs_score)) %>%
  mutate(spirit_scale = recode_factor(spirit_scale,
                                      "spev_score" = "Spiritual Events",
                                      "dse_score" = "Daily Spiritual Experiences"),
         pred_scale = recode_factor(pred_scale,
                                    "pv_score" = "Porosity Vignettes",
                                    "por_score" = "Porosity Scale",
                                    "abs_score" = "Absorption"),
         pred_type = case_when(pred_scale == "Absorption" ~ "Absorption",
                               grepl("Porosity", pred_scale) ~ "Porosity",
                               TRUE ~ NA_character_),
         pred_type = factor(pred_type, levels = c("Porosity", "Absorption")),
         study_scale = paste(study, pred_scale, sep = ": "),
         study_scale2 = case_when(
           study == "Study 4"  & pred_scale != "Absorption" ~ 
             paste(study, pred_scale, sep = ": "),
           TRUE ~ study),
         study_scale3 = case_when(
           study == "Study 4" & pred_scale == "Porosity Scale" ~ "Porosity Scale",
           study %in% c("Study 1", "Study 4") ~ "Porosity Vignettes",
           study == "Study 2" ~ "Porosity Scale", 
           TRUE ~ " "),
         study_scale3 = factor(study_scale3,
                               levels = c("Porosity Vignettes",
                                          "Porosity Scale", " "))) %>%
  filter(!is.na(pred_score),
         spirit_scale == "Spiritual Events") %>%
  ggplot(aes(x = pred_score, y = spev_score)) +
  facet_grid(rows = vars(pred_type), cols = vars(study, study_scale3)) +
  # facet_grid(pred_type ~ study_scale3) +
  geom_point(data = . %>% distinct(study, study_scale3, country, 
                                   pred_type, pred_scale, pred_score,
                                   spirit_scale, spev_score),
             aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  theme(legend.position = "bottom", 
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Score on predictor scale (Porosity Vignettes, Porosity Scale, or Absorption; rescaled to 0-1)",
       y = "Score on Spiritual Events (rescaled to 0-1)",
       # caption = "Solid black lines correspond to to the overall trend, collapsing across countries",
       color = "Country")

Spiritual Events only, by study

fig_s1 <- d_all %>%
  filter(study == "Study 1") %>%
  distinct() %>%
  gather(pred_scale, pred_score, c(pv_score, por_score, abs_score)) %>%
  mutate(pred_scale = recode_factor(pred_scale,
                                    "pv_score" = "Porosity Vignettes",
                                    "por_score" = "Porosity Scale",
                                    "abs_score" = "Absorption")) %>%
  # mutate(study_scale = paste(study, pred_scale, sep = ": ")) %>%
  filter(!is.na(pred_score)) %>%
  ggplot(aes(x = pred_score, y = spev_score)) +
  facet_grid(pred_scale ~ study) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm",
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  # theme(legend.position = "bottom", 
  #       axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  # guides(color = guide_legend(override.aes = list(alpha = 1))) +
  guides(color = F) +
  labs(x = "Score on predictor scale\n(porosity or absorption; rescaled to 0-1)",
       y = "Score on Spiritual Events scale (rescaled to 0-1)",
       # caption = "Solid black lines correspond to to the overall trend, collapsing across countries",
       color = "Country")
fig_s2 <- d_all %>%
  filter(study == "Study 2") %>%
  distinct() %>%
  gather(pred_scale, pred_score, c(pv_score, por_score, abs_score)) %>%
  mutate(pred_scale = recode_factor(pred_scale,
                                    "pv_score" = "Porosity Vignettes",
                                    "por_score" = "Porosity Scale",
                                    "abs_score" = "Absorption")) %>%
  # mutate(study_scale = paste(study, pred_scale, sep = ": ")) %>%
  filter(!is.na(pred_score)) %>%
  ggplot(aes(x = pred_score, y = spev_score)) +
  facet_grid(pred_scale ~ study) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm",
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  # theme(legend.position = "bottom", 
  #       axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  # guides(color = guide_legend(override.aes = list(alpha = 1))) +
  guides(color = F) +
  labs(x = "Score on predictor scale\n(porosity or absorption; rescaled to 0-1)",
       y = "Score on Spiritual Events scale (rescaled to 0-1)",
       # caption = "Solid black lines correspond to to the overall trend, collapsing across countries",
       color = "Country")
fig_s3 <- d_all %>%
  filter(study == "Study 3") %>%
  distinct() %>%
  gather(pred_scale, pred_score, c(pv_score, por_score, abs_score)) %>%
  mutate(pred_scale = recode_factor(pred_scale,
                                    "pv_score" = "Porosity Vignettes",
                                    "por_score" = "Porosity Scale",
                                    "abs_score" = "Absorption")) %>%
  # mutate(study_scale = paste(study, pred_scale, sep = ": ")) %>%
  filter(!is.na(pred_score)) %>%
  ggplot(aes(x = pred_score, y = spev_score)) +
  facet_grid(pred_scale ~ study) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm",
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  # theme(legend.position = "bottom", 
  #       axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  # guides(color = guide_legend(override.aes = list(alpha = 1))) +
  guides(color = F) +
  labs(x = "Score on predictor scale\n(porosity or absorption; rescaled to 0-1)",
       y = "Score on Spiritual Events scale (rescaled to 0-1)",
       # caption = "Solid black lines correspond to to the overall trend, collapsing across countries",
       color = "Country")
fig_s4 <- d_all %>%
  filter(study == "Study 4") %>%
  distinct() %>%
  gather(pred_scale, pred_score, c(pv_score, por_score, abs_score)) %>%
  mutate(pred_scale = recode_factor(pred_scale,
                                    "pv_score" = "Porosity Vignettes",
                                    "por_score" = "Porosity Scale",
                                    "abs_score" = "Absorption")) %>%
  # mutate(study_scale = paste(study, pred_scale, sep = ": ")) %>%
  filter(!is.na(pred_score)) %>%
  ggplot(aes(x = pred_score, y = spev_score)) +
  facet_grid(pred_scale ~ study) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm",
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  # theme(legend.position = "bottom", 
  #       axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  # guides(color = guide_legend(override.aes = list(alpha = 1))) +
  guides(color = F) +
  labs(x = "Score on predictor scale\n(porosity or absorption; rescaled to 0-1)",
       y = "Score on Spiritual Events scale (rescaled to 0-1)",
       # caption = "Solid black lines correspond to to the overall trend, collapsing across countries",
       color = "Country")

Spiritual Events only, full grid

d_all %>%
  distinct() %>%
  gather(pred_scale, pred_score, c(pv_score, por_score, abs_score)) %>%
  mutate(pred_scale = recode_factor(pred_scale,
                                    "pv_score" = "Porosity Vignettes",
                                    "por_score" = "Porosity Scale",
                                    "abs_score" = "Absorption")) %>%
  # mutate(study_scale = paste(study, pred_scale, sep = ": ")) %>%
  filter(!is.na(pred_score)) %>%
  ggplot(aes(x = pred_score, y = spev_score)) +
  facet_grid(pred_scale ~ study) +
  geom_point(aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm",
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  # theme(legend.position = "bottom", 
  #       axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  # guides(color = guide_legend(override.aes = list(alpha = 1))) +
  guides(color = F) +
  labs(x = "Score on predictor scale\n(porosity or absorption; rescaled to 0-1)",
       y = "Score on Spiritual Events scale (rescaled to 0-1)",
       # caption = "Solid black lines correspond to to the overall trend, collapsing across countries",
       color = "Country")

Broken down by predictor type and spiritual scale

d_all %>%
  gather(spirit_scale, spev_score, c(spev_score, dse_score)) %>%
  gather(poros_scale, poros_score, c(por_score, pv_score)) %>%
  mutate(spirit_scale = recode_factor(spirit_scale,
                                      "spev_score" = "Spiritual Events",
                                      "dse_score" = "Daily Spiritual Experiences"),
         poros_scale = recode_factor(poros_scale,
                                     "pv_score" = "Porosity Vignettes",
                                     "por_score" = "Porosity Scale"),
         study_scale = paste(study, poros_scale, sep = ": ")) %>%
  filter(!is.na(poros_score)) %>%
  ggplot(aes(x = poros_score, y = spev_score)) +
  facet_grid(spirit_scale ~ study_scale) +
  geom_point(data = . %>% distinct(study, study_scale, country, 
                                   poros_scale, poros_score,
                                   spirit_scale, spev_score),
             aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  theme(legend.position = "bottom", 
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Score on porosity measure (rescaled to 0-1)",
       y = "Score on spiritual experience measure (rescaled to 0-1)",
       # caption = "Solid black lines correspond to to the overall trend, collapsing across countries",
       color = "Country")

d_all %>%
  gather(spirit_scale, spev_score, c(spev_score, dse_score)) %>%
  mutate(spirit_scale = recode_factor(spirit_scale,
                                      "spev_score" = "Spiritual Events",
                                      "dse_score" = "Daily Spiritual Experiences"),
         study_scale = paste(study, "Absorption scale", sep = ": ")) %>%
  filter(!is.na(abs_score)) %>%
  ggplot(aes(x = abs_score, y = spev_score)) +
  facet_grid(spirit_scale ~ study_scale) +
  geom_point(data = . %>% distinct(study, study_scale, country, 
                                   abs_score,
                                   spirit_scale, spev_score),
             aes(color = country), alpha = 0.2) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  theme(legend.position = "bottom", 
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Score on absorption measure (rescaled to 0-1)",
       y = "Score on spiritual experience measure (rescaled to 0-1)",
       # caption = "Solid black lines correspond to to the overall trend, collapsing across countries",
       color = "Country")

Histograms of absorption

Study 1

ggplot(d_all %>% filter(study != "Study 3"), 
       aes(x = abs_score * 34)) +
  facet_grid(study ~ country, scales = "free_y") +
  geom_histogram(binwidth = 2) +
  scale_x_continuous(breaks = seq(0, 34, 5)) +
  labs(x = "Absorption score (range: 0-34)", y = "Number of participants")

d_sum_abs <- d_all %>%
  filter(study != "Study 3") %>%
  group_by(study, country, religion) %>%
  mutate(abs_score = abs_score * 34) %>%
  summarise_at(vars(abs_score),
               funs(mean = mean(., na.rm = T), sd = sd(., na.rm = T))) %>%
  ungroup()
d_sum_abs %>%
  kable(digits = 2)
study country religion mean sd
Study 1 US Local Religion 18.28 6.51
Study 1 US Charismatic Christianity 19.38 6.82
Study 1 Ghana Local Religion 23.61 8.55
Study 1 Ghana Charismatic Christianity 19.39 6.60
Study 1 Thailand Local Religion 21.68 5.16
Study 1 Thailand Charismatic Christianity 20.17 6.91
Study 1 China Local Religion 20.83 5.45
Study 1 China Charismatic Christianity 16.51 7.95
Study 1 Vanuatu Local Religion 25.11 6.97
Study 1 Vanuatu Charismatic Christianity 24.49 5.71
Study 2 US General Population 19.59 6.46
Study 2 Ghana General Population 18.35 6.84
Study 2 Thailand General Population 19.48 5.20
Study 2 China General Population 22.19 5.41
Study 2 Vanuatu General Population 23.97 5.54
Study 4 US General Population 20.75 7.98
Study 4 Ghana General Population 21.36 5.68
Study 4 Thailand General Population 18.12 5.35
Study 4 China General Population 23.46 5.30
Study 4 Vanuatu General Population 23.32 6.46
LS0tCnRpdGxlOiAiU3R1ZGllcyAxLTQ6IEZpZ3VyZXMiCnN1YnRpdGxlOiAiTHVocm1hbm4sIFdlaXNtYW4sIGV0IGFsLiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IGZsYXRseQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSBjcmVhdGUgZmlndXJlcyBmb3IgU3R1ZGllcyAxLTQuCgpgYGB7cn0Kc291cmNlKCIuL3NjcmlwdHNfZ2VuZXJhbC9kZXBlbmRlbmNpZXMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzX2dlbmVyYWwvY3VzdG9tX2Z1bnMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzX2dlbmVyYWwvdmFyX3JlY29kZV9jb250cmFzdC5SIikKc291cmNlKCIuL3N0dWR5MS9zY3JpcHRzX3MxL3MxX3Zhcl9ncm91cHMuUiIpCnNvdXJjZSgiLi9zdHVkeTIvc2NyaXB0c19zMi9zMl92YXJfZ3JvdXBzLlIiKQpzb3VyY2UoIi4vc3R1ZHkzL3NjcmlwdHNfczMvczNfdmFyX2dyb3Vwcy5SIikKc291cmNlKCIuL3N0dWR5NC9zY3JpcHRzX3M0L3M0X3Zhcl9ncm91cHMuUiIpCmBgYAoKYGBge3J9CnNldHdkKCIuL3N0dWR5MS9hbmFseXNpcy8iKQpzb3VyY2UoIi4uLy4uL3NjcmlwdHNfZ2VuZXJhbC9kYXRhX2xvYWQuUiIpCmBgYAoKYGBge3J9CnJzcV9mdW4gPC0gZnVuY3Rpb24ocmVnKXsKICByZWdfY2xhc3MgPC0gY2xhc3MocmVnKQogIHJlcyA8LSByc3F1YXJlZChyZWcpCiAgCiAgaWYgKGdyZXBsKCJsbWVyTW9kIiwgcmVnX2NsYXNzKSkgewogICAgcnNxIDwtIHJlcyRDb25kaXRpb25hbAogIH0gZWxzZSB7CiAgICByc3EgPC0gcmVzJFIuc3F1YXJlZAogIH0KICByZXR1cm4ocnNxKQp9CmBgYAoKYGBge3J9CmRfYWxsIDwtIGQxICU+JQogIHNlbGVjdChzdHVkeSwgY291bnRyeSwgc2l0ZSwgcmVsaWdpb24sIHN1YmplY3RfaWQsIAogICAgICAgICBwdl9zY29yZSwgYWJzX3Njb3JlLCBzcGV2X3Njb3JlKSAlPiUKICBtdXRhdGUocmVsaWdpb24gPSByZWNvZGVfZmFjdG9yKHJlbGlnaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsIiA9ICJMb2NhbCBSZWxpZ2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhcmlzbWF0aWMiID0gIkNoYXJpc21hdGljIENocmlzdGlhbml0eSIpLAogICAgICAgICAjIHJlc2NhbGUgdG8gMC0xCiAgICAgICAgIHB2X3Njb3JlID0gcHZfc2NvcmUvMykgJT4lCiAgZnVsbF9qb2luKGQyICU+JSAKICAgICAgICAgICAgICBzZWxlY3Qoc3R1ZHksIGNvdW50cnksIHN1YmosIAogICAgICAgICAgICAgICAgICAgICBhYnNfc2NvcmUsIHNwZXZfc2NvcmUsIGRzZV9zY29yZSkgJT4lIAogICAgICAgICAgICAgIHJlbmFtZShzdWJqZWN0X2lkID0gc3ViaikgJT4lCiAgICAgICAgICAgICAgIyByZXNjYWxlIHRvIDAtMQogICAgICAgICAgICAgIG11dGF0ZShzcGV2X3Njb3JlID0gc3Bldl9zY29yZS80LAogICAgICAgICAgICAgICAgICAgICBkc2Vfc2NvcmUgPSBkc2Vfc2NvcmUvNSwKICAgICAgICAgICAgICAgICAgICAgcmVsaWdpb24gPSAiR2VuZXJhbCBQb3B1bGF0aW9uIikpICU+JQogIGZ1bGxfam9pbihkMyAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KHN0dWR5LCBlcGlfY3RyeSwgZXBpX3NhbXBsZSwgZXBpX3N1YmosIAogICAgICAgICAgICAgICAgICAgICBwb3Jfc2NvcmUsIHNwaXJpdF9zY29yZSkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKGNvdW50cnkgPSBlcGlfY3RyeSwgCiAgICAgICAgICAgICAgICAgICAgIHJlbGlnaW9uID0gZXBpX3NhbXBsZSwKICAgICAgICAgICAgICAgICAgICAgc3ViamVjdF9pZCA9IGVwaV9zdWJqLAogICAgICAgICAgICAgICAgICAgICBzcGV2X3Njb3JlID0gc3Bpcml0X3Njb3JlKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUocmVsaWdpb24gPSByZWNvZGVfZmFjdG9yKHJlbGlnaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdlbmVyYWwgcG9wdWxhdGlvbiIgPSAiR2VuZXJhbCBQb3B1bGF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGFyaXNtYXRpYyIgPSAiQ2hhcmlzbWF0aWMgQ2hyaXN0aWFuaXR5IikpKSAlPiUKICBmdWxsX2pvaW4oZDQgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KHN0dWR5LCBwN19jdHJ5LCBwN19zdWJqLCAKICAgICAgICAgICAgICAgICAgICAgcG9yX3Njb3JlLCBwdl9zY29yZSwgYWJzX3Njb3JlLCBzcGV2X3Njb3JlLCBkc2Vfc2NvcmUpICU+JQogICAgICAgICAgICAgIHJlbmFtZShjb3VudHJ5ID0gcDdfY3RyeSwKICAgICAgICAgICAgICAgICAgICAgc3ViamVjdF9pZCA9IHA3X3N1YmopICU+JQogICAgICAgICAgICAgICMgcmVzY2FsZSB0byAwLTEKICAgICAgICAgICAgICBtdXRhdGUocG9yX3Njb3JlID0gcG9yX3Njb3JlLzIsCiAgICAgICAgICAgICAgICAgICAgIHB2X3Njb3JlID0gcHZfc2NvcmUvMywKICAgICAgICAgICAgICAgICAgICAgc3Bldl9zY29yZSA9IHNwZXZfc2NvcmUvNCwKICAgICAgICAgICAgICAgICAgICAgZHNlX3Njb3JlID0gZHNlX3Njb3JlLzUsCiAgICAgICAgICAgICAgICAgICAgIHJlbGlnaW9uID0gIkdlbmVyYWwgUG9wdWxhdGlvbiIpKSAlPiUKICBtdXRhdGUocmVsaWdpb24gPSBmYWN0b3IocmVsaWdpb24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJHZW5lcmFsIFBvcHVsYXRpb24iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9jYWwgUmVsaWdpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGFyaXNtYXRpYyBDaHJpc3RpYW5pdHkiKSksCiAgICAgICAgIHN0dWR5ID0gZ3N1Yigic3R1ZHkiLCAiU3R1ZHkiLCBzdHVkeSkpIApgYGAKCgojIFN1bW1hcnkgc3RhdGlzdGljcwoKIyMgQnkgc3R1ZHkKCiMjIyBTdHVkeSA0CgpgYGB7cn0KZF9zdW1fczEgPC0gZF9hbGwgJT4lCiAgZmlsdGVyKHN0dWR5ID09ICJTdHVkeSAxIikgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgcmVsaWdpb24sIHNpdGUpICU+JQogIHN1bW1hcmlzZV9hdCh2YXJzKHNwZXZfc2NvcmUsIHB2X3Njb3JlLCBhYnNfc2NvcmUpLAogICAgICAgICAgICAgICBmdW5zKG1lYW4gPSBtZWFuKC4sIG5hLnJtID0gVCksIHNkID0gc2QoLiwgbmEucm0gPSBUKSkpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyfQpkX3JzcV9zMSA8LSBkYXRhLmZyYW1lKAogIHZhciA9IGMoInNwZXZfc2NvcmUiLCAicHZfc2NvcmUiLCAiYWJzX3Njb3JlIiksCiAgcnNxX2ZpeCA9IGMocnNxX2Z1bihsbShzcGV2X3Njb3JlIH4gY291bnRyeSwgZF9hbGwgJT4lIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgMSIpKSksCiAgICAgICAgICAgICAgcnNxX2Z1bihsbShwdl9zY29yZSB+IGNvdW50cnksIGRfYWxsICU+JSBmaWx0ZXIoc3R1ZHkgPT0gIlN0dWR5IDEiKSkpLAogICAgICAgICAgICAgIHJzcV9mdW4obG0oYWJzX3Njb3JlIH4gY291bnRyeSwgZF9hbGwgJT4lIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgMSIpKSkpLAogIHJzcV9yYW4gPSBjKHJzcV9mdW4obG1lcihzcGV2X3Njb3JlIH4gMSArICgxIHwgY291bnRyeSksIAogICAgICAgICAgICAgICAgICAgICAgICAgZF9hbGwgJT4lIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgMSIpKSksCiAgICAgICAgICAgICAgcnNxX2Z1bihsbWVyKHB2X3Njb3JlIH4gMSArICgxIHwgY291bnRyeSksIAogICAgICAgICAgICAgICAgICAgICAgICAgZF9hbGwgJT4lIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgMSIpKSksCiAgICAgICAgICAgICAgcnNxX2Z1bihsbWVyKGFic19zY29yZSB+IDEgKyAoMSB8IGNvdW50cnkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRfYWxsICU+JSBmaWx0ZXIoc3R1ZHkgPT0gIlN0dWR5IDEiKSkpKSkKZF9yc3FfczEKYGBgCgpgYGB7cn0KcGxvdF9zMV9zcGV2IDwtIGRfYWxsICU+JSAjIFhYIEJPT0tNQVJLCiAgZmlsdGVyKHN0dWR5ID09ICJTdHVkeSAxIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY291bnRyeSwgeSA9IHNwZXZfc2NvcmUsIAogICAgICAgICAgICAgY29sb3IgPSBjb3VudHJ5LCBmaWxsID0gY291bnRyeSwgCiAgICAgICAgICAgICBzaGFwZSA9IHNpdGUpKSArCiAgZmFjZXRfZ3JpZCh+IHJlbGlnaW9uKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci53aWR0aCA9IDAuMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci5oZWlnaHQgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuNSksIAogICAgICAgICAgICAgYWxwaGEgPSAwLjI1LCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoY291bnRyeSwgcmVsaWdpb24sIHNpdGUpICU+JQogICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihzcGV2X3Njb3JlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHNkKHNwZXZfc2NvcmUsIG5hLnJtID0gVCkpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gbWVhbiAtIHNkLCB5bWF4ID0gbWVhbiArIHNkKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChkYXRhID0gZF9zdW1fczEgJT4lCiAgICAgICAgICAgICAgbXV0YXRlX2F0KHZhcnMoLWNvdW50cnksIC1yZWxpZ2lvbiwgLXNpdGUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSksCiAgICAgICAgICAgIGFlcyh5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoc3Bldl9zY29yZV9tZWFuLCAiXG4oIiwgc3Bldl9zY29yZV9zZCwgIikiKSksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjc1KSwKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41LCB2anVzdCA9IDEpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSAyMToyNCkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKE5BLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoY29sb3IgPSBGLCBmaWxsID0gRiwgCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoZmlsbCA9ICJibGFjayIpKSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJTcGlyaXR1YWwgRXZlbnRzIiwgc2hhcGUgPSAiU2l0ZSIpCmBgYAoKYGBge3J9CmZpZ18wX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU1RVRFkgMSIsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwLjUpICsKICB0aGVtZShwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAzNSkpCgpmaWdfMCA8LSBwbG90X2dyaWQoCiAgZmlnXzBfdGl0bGUsCiAgcGxvdF9ncmlkKHBsb3RfczFfc3BldiwgCiAgICAgICAgICAgIG5jb2wgPSAxKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDIwKSkKIyBmaWdfMApgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LjUsIGZpZy5hc3AgPSAwLjV9CmZpZ18wCmBgYAoKCiMjIyBTdHVkeSA0CgoKYGBge3J9CmRfc3VtX3M0IDwtIGRfYWxsICU+JQogIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgNCIpICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZV9hdCh2YXJzKHNwZXZfc2NvcmUsIGRzZV9zY29yZSwgcHZfc2NvcmUsIHBvcl9zY29yZSwgYWJzX3Njb3JlKSwKICAgICAgICAgICAgICAgZnVucyhtZWFuID0gbWVhbiguLCBuYS5ybSA9IFQpLCBzZCA9IHNkKC4sIG5hLnJtID0gVCkpKSAlPiUKICB1bmdyb3VwKCkKYGBgCgpgYGB7cn0KZF9yc3FfczQgPC0gZGF0YS5mcmFtZSgKICB2YXIgPSBjKCJzcGV2X3Njb3JlIiwgImRzZV9zY29yZSIsICJwdl9zY29yZSIsICJwb3Jfc2NvcmUiLCAiYWJzX3Njb3JlIiksCiAgcnNxX2ZpeCA9IGMocnNxX2Z1bihsbShzcGV2X3Njb3JlIH4gY291bnRyeSwgZF9hbGwgJT4lIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgNCIpKSksCiAgICAgICAgICAgICAgcnNxX2Z1bihsbShkc2Vfc2NvcmUgfiBjb3VudHJ5LCBkX2FsbCAlPiUgZmlsdGVyKHN0dWR5ID09ICJTdHVkeSA0IikpKSwKICAgICAgICAgICAgICByc3FfZnVuKGxtKHB2X3Njb3JlIH4gY291bnRyeSwgZF9hbGwgJT4lIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgNCIpKSksCiAgICAgICAgICAgICAgcnNxX2Z1bihsbShwb3Jfc2NvcmUgfiBjb3VudHJ5LCBkX2FsbCAlPiUgZmlsdGVyKHN0dWR5ID09ICJTdHVkeSA0IikpKSwKICAgICAgICAgICAgICByc3FfZnVuKGxtKGFic19zY29yZSB+IGNvdW50cnksIGRfYWxsICU+JSBmaWx0ZXIoc3R1ZHkgPT0gIlN0dWR5IDQiKSkpKSwKICByc3FfcmFuID0gYyhyc3FfZnVuKGxtZXIoc3Bldl9zY29yZSB+IDEgKyAoMSB8IGNvdW50cnkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRfYWxsICU+JSBmaWx0ZXIoc3R1ZHkgPT0gIlN0dWR5IDQiKSkpLAogICAgICAgICAgICAgIHJzcV9mdW4obG1lcihkc2Vfc2NvcmUgfiAxICsgKDEgfCBjb3VudHJ5KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkX2FsbCAlPiUgZmlsdGVyKHN0dWR5ID09ICJTdHVkeSA0IikpKSwKICAgICAgICAgICAgICByc3FfZnVuKGxtZXIocHZfc2NvcmUgfiAxICsgKDEgfCBjb3VudHJ5KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkX2FsbCAlPiUgZmlsdGVyKHN0dWR5ID09ICJTdHVkeSA0IikpKSwKICAgICAgICAgICAgICByc3FfZnVuKGxtZXIocG9yX3Njb3JlIH4gMSArICgxIHwgY291bnRyeSksIAogICAgICAgICAgICAgICAgICAgICAgICAgZF9hbGwgJT4lIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgNCIpKSksCiAgICAgICAgICAgICAgcnNxX2Z1bihsbWVyKGFic19zY29yZSB+IDEgKyAoMSB8IGNvdW50cnkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRfYWxsICU+JSBmaWx0ZXIoc3R1ZHkgPT0gIlN0dWR5IDQiKSkpKSkKZF9yc3FfczQKYGBgCgpgYGB7cn0KcGxvdF9zNF9zcGV2IDwtIGRfYWxsICU+JQogIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgNCIpICU+JQogIGdncGxvdChhZXMoeCA9IGNvdW50cnksIHkgPSBzcGV2X3Njb3JlLCBjb2xvciA9IGNvdW50cnksIGZpbGwgPSBjb3VudHJ5KSkgKwogIGdlb21faml0dGVyKGhlaWdodCA9IDAsIHdpZHRoID0gMC4yNSwgYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRiApICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHNwZXZfc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2Qoc3Bldl9zY29yZSwgbmEucm0gPSBUKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBtZWFuIC0gc2QsIHltYXggPSBtZWFuICsgc2QpLAogICAgICAgICAgICAgICAgICBzaGFwZSA9IDIzLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fdGV4dChkYXRhID0gZF9zdW1fczQgJT4lCiAgICAgICAgICAgICAgbXV0YXRlX2F0KHZhcnMoLWNvdW50cnkpLCBmdW5zKGZvcm1hdChyb3VuZCguLCAyKSwgbnNtYWxsID0gMikpKSwKICAgICAgICAgICAgYWVzKHkgPSAxLCBsYWJlbCA9IHBhc3RlMChzcGV2X3Njb3JlX21lYW4sICJcbigiLCBzcGV2X3Njb3JlX3NkLCAiKSIpKSwKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41LCB2anVzdCA9IDEpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKE5BLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgbGFicyh4ID0gIkNvdW50cnkiLCB5ID0gIlNwaXJpdHVhbCBFdmVudHMiKQpgYGAKCmBgYHtyfQpwbG90X3M0X2RzZSA8LSBkX2FsbCAlPiUKICBmaWx0ZXIoc3R1ZHkgPT0gIlN0dWR5IDQiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5LCB5ID0gZHNlX3Njb3JlLCBjb2xvciA9IGNvdW50cnksIGZpbGwgPSBjb3VudHJ5KSkgKwogIGdlb21faml0dGVyKGhlaWdodCA9IDAsIHdpZHRoID0gMC4yNSwgYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRiApICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGRzZV9zY29yZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZChkc2Vfc2NvcmUsIG5hLnJtID0gVCkpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gbWVhbiAtIHNkLCB5bWF4ID0gbWVhbiArIHNkKSwKICAgICAgICAgICAgICAgICAgc2hhcGUgPSAyMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3RleHQoZGF0YSA9IGRfc3VtX3M0ICU+JQogICAgICAgICAgICAgIG11dGF0ZV9hdCh2YXJzKC1jb3VudHJ5KSwgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSksCiAgICAgICAgICAgIGFlcyh5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoZHNlX3Njb3JlX21lYW4sICJcbigiLCBkc2Vfc2NvcmVfc2QsICIpIikpLAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUsIHZqdXN0ID0gMSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoTkEsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC4yNSkpICsKICBsYWJzKHggPSAiQ291bnRyeSIsIHkgPSAiRGFpbHkgU3Bpcml0dWFsIEV4cGVyaWVuY2VzIikKYGBgCgpgYGB7cn0KcGxvdF9zNF9wdiA8LSBkX2FsbCAlPiUKICBmaWx0ZXIoc3R1ZHkgPT0gIlN0dWR5IDQiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5LCB5ID0gcHZfc2NvcmUsIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMCwgd2lkdGggPSAwLjI1LCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGICkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShjb3VudHJ5KSAlPiUKICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UobWVhbiA9IG1lYW4ocHZfc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2QocHZfc2NvcmUsIG5hLnJtID0gVCkpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gbWVhbiAtIHNkLCB5bWF4ID0gbWVhbiArIHNkKSwKICAgICAgICAgICAgICAgICAgc2hhcGUgPSAyMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3RleHQoZGF0YSA9IGRfc3VtX3M0ICU+JQogICAgICAgICAgICAgIG11dGF0ZV9hdCh2YXJzKC1jb3VudHJ5KSwgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSksCiAgICAgICAgICAgIGFlcyh5ID0gMSwgbGFiZWwgPSBwYXN0ZTAocHZfc2NvcmVfbWVhbiwgIlxuKCIsIHB2X3Njb3JlX3NkLCAiKSIpKSwKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41LCB2anVzdCA9IDEpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKE5BLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgbGFicyh4ID0gIkNvdW50cnkiLCB5ID0gIlBvcm9zaXR5IFZpZ25ldHRlcyIpCmBgYAoKYGBge3J9CnBsb3RfczRfcG9yIDwtIGRfYWxsICU+JQogIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgNCIpICU+JQogIGdncGxvdChhZXMoeCA9IGNvdW50cnksIHkgPSBwb3Jfc2NvcmUsIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMCwgd2lkdGggPSAwLjI1LCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGICkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShjb3VudHJ5KSAlPiUKICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UobWVhbiA9IG1lYW4ocG9yX3Njb3JlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHNkKHBvcl9zY29yZSwgbmEucm0gPSBUKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBtZWFuIC0gc2QsIHltYXggPSBtZWFuICsgc2QpLAogICAgICAgICAgICAgICAgICBzaGFwZSA9IDIzLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fdGV4dChkYXRhID0gZF9zdW1fczQgJT4lCiAgICAgICAgICAgICAgbXV0YXRlX2F0KHZhcnMoLWNvdW50cnkpLCBmdW5zKGZvcm1hdChyb3VuZCguLCAyKSwgbnNtYWxsID0gMikpKSwKICAgICAgICAgICAgYWVzKHkgPSAxLCBsYWJlbCA9IHBhc3RlMChwb3Jfc2NvcmVfbWVhbiwgIlxuKCIsIHBvcl9zY29yZV9zZCwgIikiKSksCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIuNSwgdmp1c3QgPSAxKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyhOQSwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJQb3Jvc2l0eSBTY2FsZSIpCmBgYAoKYGBge3J9CnBsb3RfczRfYWJzIDwtIGRfYWxsICU+JQogIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgNCIpICU+JQogIGdncGxvdChhZXMoeCA9IGNvdW50cnksIHkgPSBhYnNfc2NvcmUsIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMCwgd2lkdGggPSAwLjI1LCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGICkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShjb3VudHJ5KSAlPiUKICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oYWJzX3Njb3JlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHNkKGFic19zY29yZSwgbmEucm0gPSBUKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBtZWFuIC0gc2QsIHltYXggPSBtZWFuICsgc2QpLAogICAgICAgICAgICAgICAgICBzaGFwZSA9IDIzLCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fdGV4dChkYXRhID0gZF9zdW1fczQgJT4lCiAgICAgICAgICAgICAgbXV0YXRlX2F0KHZhcnMoLWNvdW50cnkpLCBmdW5zKGZvcm1hdChyb3VuZCguLCAyKSwgbnNtYWxsID0gMikpKSwKICAgICAgICAgICAgYWVzKHkgPSAxLCBsYWJlbCA9IHBhc3RlMChhYnNfc2NvcmVfbWVhbiwgIlxuKCIsIGFic19zY29yZV9zZCwgIikiKSksCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIuNSwgdmp1c3QgPSAxKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyhOQSwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJBYnNvcnB0aW9uIikKYGBgCgpgYGB7cn0KZmlnXzJfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTVFVEWSA0IiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDAuNSkgKwogIHRoZW1lKHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDM1KSkKCmZpZ18yIDwtIHBsb3RfZ3JpZCgKICBmaWdfMl90aXRsZSwKICBwbG90X2dyaWQocGxvdF9zNF9zcGV2LCBwbG90X3M0X2RzZSwgCiAgICAgICAgICAgIHBsb3RfczRfcHYsIHBsb3RfczRfcG9yLCAKICAgICAgICAgICAgcGxvdF9zNF9hYnMsIE5VTEwsIAogICAgICAgICAgICBuY29sID0gMiwgbGFiZWxzID0gYygiQSIsICJCIiwgIkMiLCAiRCIsICJFIikpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMjApKQojIGZpZ18yCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmFzcCA9IDEuNX0KZmlnXzIKYGBgCgoKIyMgU3Bpcml0dWFsIEV2ZW50cyBzY29yZXMKCiMjIyBTdHVkeSAxCgpgYGB7cn0KZDEgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY291bnRyeSwgeSA9IHNwZXZfc2NvcmUsIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMCwgd2lkdGggPSAwLjI1LCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGICkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShjb3VudHJ5KSAlPiUKICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oc3Bldl9zY29yZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZChzcGV2X3Njb3JlLCBuYS5ybSA9IFQpKSAlPiUKICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IG1lYW4gLSBzZCwgeW1heCA9IG1lYW4gKyBzZCksCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMjMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgbGFicyh4ID0gIkNvdW50cnkiLCB5ID0gIlN0dWR5IDE6IFNwaXJpdHVhbCBFdmVudHMgc2NvcmUgKHJhbmdlOiAwLTEpIiwKICAgICAgIGNhcHRpb24gPSAiRXJyb3IgYmFycyBhcmUgwrExIHN0YW5kYXJkIGRldmlhdGlvbiBmcm9tIHRoZSBtZWFuIikKYGBgCgpgYGB7cn0KZF9hbGwgJT4lCiAgZmlsdGVyKHN0dWR5ID09ICJTdHVkeSAxIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY291bnRyeSwgeSA9IHNwZXZfc2NvcmUsIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMCwgd2lkdGggPSAwLjI1LCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGICkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShjb3VudHJ5LCByZWxpZ2lvbikgJT4lCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHNwZXZfc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2Qoc3Bldl9zY29yZSwgbmEucm0gPSBUKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBtZWFuIC0gc2QsIHltYXggPSBtZWFuICsgc2QsCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IHJlbGlnaW9uKSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFQpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSAyMToyNCkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC4yNSkpICsKICBndWlkZXMoY29sb3IgPSBGLCBmaWxsID0gRiwgCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoZmlsbCA9ICJibGFjayIpKSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJTdHVkeSAxOiBTcGlyaXR1YWwgRXZlbnRzIHNjb3JlIChyYW5nZTogMC0xKSIsCiAgICAgICBjYXB0aW9uID0gIkVycm9yIGJhcnMgYXJlIMKxMSBzdGFuZGFyZCBkZXZpYXRpb24gZnJvbSB0aGUgbWVhbiIpCmBgYAoKIyMjIFN0dWR5IDIKCmBgYHtyfQpkMiAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5LCB5ID0gc3Bldl9zY29yZSwgY29sb3IgPSBjb3VudHJ5LCBmaWxsID0gY291bnRyeSkpICsKICBnZW9tX2ppdHRlcihoZWlnaHQgPSAwLCB3aWR0aCA9IDAuMjUsIGFscGhhID0gMC4yLCBzaG93LmxlZ2VuZCA9IEYgKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSAuICU+JQogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvdW50cnkpICU+JQogICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihzcGV2X3Njb3JlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHNkKHNwZXZfc2NvcmUsIG5hLnJtID0gVCkpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gbWVhbiAtIHNkLCB5bWF4ID0gbWVhbiArIHNkKSwKICAgICAgICAgICAgICAgICAgc2hhcGUgPSAyMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKE5BLCA0KSwgYnJlYWtzID0gc2VxKDAsIDQsIDEpKSArCiAgbGFicyh4ID0gIkNvdW50cnkiLCB5ID0gIlN0dWR5IDI6IFNwaXJpdHVhbCBFdmVudHMgc2NvcmUgKHJhbmdlOiAwLTQpIiwKICAgICAgIGNhcHRpb24gPSAiRXJyb3IgYmFycyBhcmUgwrExIHN0YW5kYXJkIGRldmlhdGlvbiBmcm9tIHRoZSBtZWFuIikKYGBgCgojIyMgU3R1ZHkgMwoKYGBge3J9CmQzICU+JQogICMgY29ycmVjdCBmb3Igc2NhbGluZyBpbiBvcmlnaW5hbCBkYXRhc2V0CiAgbXV0YXRlKHNwZXZfc2NvcmUgPSBzcGlyaXRfc2NvcmUgKiA0KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBlcGlfY3RyeSwgeSA9IHNwZXZfc2NvcmUsIGNvbG9yID0gZXBpX2N0cnksIGZpbGwgPSBlcGlfY3RyeSkpICsKICBnZW9tX2ppdHRlcihoZWlnaHQgPSAwLCB3aWR0aCA9IDAuMjUsIGFscGhhID0gMC4yLCBzaG93LmxlZ2VuZCA9IEYgKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSAuICU+JQogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KGVwaV9jdHJ5KSAlPiUKICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oc3Bldl9zY29yZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZChzcGV2X3Njb3JlLCBuYS5ybSA9IFQpKSAlPiUKICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IG1lYW4gLSBzZCwgeW1heCA9IG1lYW4gKyBzZCksCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMjMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyhOQSwgNCksIGJyZWFrcyA9IHNlcSgwLCA0LCAxKSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJTdHVkeSAzOiBTcGlyaXR1YWwgRXZlbnRzIHNjb3JlIChyYW5nZTogMC00KSIsCiAgICAgICBjYXB0aW9uID0gIkVycm9yIGJhcnMgYXJlIMKxMSBzdGFuZGFyZCBkZXZpYXRpb24gZnJvbSB0aGUgbWVhbiIpCmBgYAoKIyMjIFN0dWR5IDQKCmBgYHtyfQpkNCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwN19jdHJ5LCB5ID0gc3Bldl9zY29yZSwgY29sb3IgPSBwN19jdHJ5LCBmaWxsID0gcDdfY3RyeSkpICsKICBnZW9tX2ppdHRlcihoZWlnaHQgPSAwLCB3aWR0aCA9IDAuMjUsIGFscGhhID0gMC4yLCBzaG93LmxlZ2VuZCA9IEYgKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSAuICU+JQogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KHA3X2N0cnkpICU+JQogICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihzcGV2X3Njb3JlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHNkKHNwZXZfc2NvcmUsIG5hLnJtID0gVCkpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gbWVhbiAtIHNkLCB5bWF4ID0gbWVhbiArIHNkKSwKICAgICAgICAgICAgICAgICAgc2hhcGUgPSAyMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKE5BLCA0KSwgYnJlYWtzID0gc2VxKDAsIDQsIDEpKSArCiAgbGFicyh4ID0gIkNvdW50cnkiLCB5ID0gIlN0dWR5IDQ6IFNwaXJpdHVhbCBFdmVudHMgc2NvcmUgKHJhbmdlOiAwLTQpIiwKICAgICAgIGNhcHRpb24gPSAiRXJyb3IgYmFycyBhcmUgwrExIHN0YW5kYXJkIGRldmlhdGlvbiBmcm9tIHRoZSBtZWFuIikKYGBgCgojIyMgQWxsIHN0dWRpZXMKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC44fQpkX2FsbCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5LCB5ID0gc3Bldl9zY29yZSwgY29sb3IgPSBjb3VudHJ5LCBmaWxsID0gY291bnRyeSwKICAgICAgICAgICAgIGdyb3VwID0gc3R1ZHkpKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci53aWR0aCA9IDAuMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci5oZWlnaHQgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuNzUpLCAKICAgICAgICAgICAgIGFscGhhID0gMC4xKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkX2FsbCAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShzdHVkeSwgY291bnRyeSkgJT4lCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHNwZXZfc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2Qoc3Bldl9zY29yZSwgbmEucm0gPSBUKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBtZWFuIC0gc2QsIHltYXggPSBtZWFuICsgc2QsIHNoYXBlID0gc3R1ZHkpLCAKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNzUpLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gMjE6MjQpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGd1aWRlcyhjb2xvciA9IEYsIGZpbGwgPSBGLCAKICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChmaWxsID0gImJsYWNrIikpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBsYWJzKHggPSAiQ291bnRyeSIsIHkgPSAiU3Bpcml0dWFsIEV2ZW50cyBzY29yZSAocmVzY2FsZWQgdG8gMC0xKSIsCiAgICAgICBzaGFwZSA9ICJTdHVkeSIsIAogICAgICAgY2FwdGlvbiA9ICJFcnJvciBiYXJzIGFyZSDCsTEgc3RhbmRhcmQgZGV2aWF0aW9uIGZyb20gdGhlIG1lYW4iKQpgYGAKCmBgYHtyfQpkX3NwZXZfc3VtIDwtIGRfYWxsICU+JQogIGZpbHRlcighaXMubmEoc3Bldl9zY29yZSkpICU+JQogIGdyb3VwX2J5KHN0dWR5LCBjb3VudHJ5LCByZWxpZ2lvbikgJT4lCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHNwZXZfc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHNkID0gc2Qoc3Bldl9zY29yZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbiA9IG4oKSkgJT4lCiAgdW5ncm91cCgpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjQ1fQpkX2FsbCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5LCB5ID0gc3Bldl9zY29yZSwgCiAgICAgICAgICAgICBjb2xvciA9IGNvdW50cnksIGZpbGwgPSBjb3VudHJ5LAogICAgICAgICAgICAgZ3JvdXAgPSByZWxpZ2lvbikpICsKICBmYWNldF9ncmlkKH4gc3R1ZHksIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX3BvaW50KHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLndpZHRoID0gMC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIuaGVpZ2h0ID0gMC4wMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9kZ2Uud2lkdGggPSAwLjc1KSwgCiAgICAgICAgICAgICBhbHBoYSA9IDAuMTUpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IGRfc3Bldl9zdW0sCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IG1lYW4gLSBzZCwgeW1heCA9IG1lYW4gKyBzZCwgCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IHJlbGlnaW9uKSwgCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjc1KSwKICAgICAgICAgICAgICAgICAgZmlsbCA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChkYXRhID0gZF9zcGV2X3N1bSAlPiUKICAgICAgICAgICAgICBtdXRhdGUoeXBvcyA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgICAgIGdyZXBsKCJjaGFyaXNtYXRpYyIsIHRvbG93ZXIocmVsaWdpb24pKSB+IG1lYW4gKyBzZCArIDAuMDUsCiAgICAgICAgICAgICAgICBUUlVFIH4gbWVhbiAtIHNkIC0gMC4wNSkpLAogICAgICAgICAgICBhZXMoeSA9IHlwb3MsIGxhYmVsID0gcGFzdGUwKCJuPSIsIG4pKSwgCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjc1KSwKICAgICAgICAgICAgc2l6ZSA9IDMsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSAyMToyNCkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgZ3VpZGVzKGNvbG9yID0gRiwgZmlsbCA9IEYsIAogICAgICAgICBzaGFwZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGZpbGwgPSAiYmxhY2siKSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHggPSAiQ291bnRyeSIsIHkgPSAiU3Bpcml0dWFsIEV2ZW50cyBzY29yZSAocmVzY2FsZWQgdG8gMC0xKSIsCiAgICAgICAjIGNhcHRpb24gPSAiRXJyb3IgYmFycyBhcmUgwrExIHN0YW5kYXJkIGRldmlhdGlvbiBmcm9tIHRoZSBtZWFuIiwKICAgICAgIHNoYXBlID0gIlJlbGlnaW9uIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDF9CmRfYWxsICU+JQogIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgMSIpICU+JQogIGdncGxvdChhZXMoeCA9IGNvdW50cnksIHkgPSBzcGV2X3Njb3JlLCAKICAgICAgICAgICAgIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnksCiAgICAgICAgICAgICBncm91cCA9IHJlbGlnaW9uKSkgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIud2lkdGggPSAwLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci5oZWlnaHQgPSAwLjAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuNzUpLCAKICAgICAgICAgICAgIGFscGhhID0gMC4xNSkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZF9zcGV2X3N1bSAlPiUKICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc3R1ZHkgPT0gIlN0dWR5IDEiKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gbWVhbiAtIHNkLCB5bWF4ID0gbWVhbiArIHNkLCAKICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gcmVsaWdpb24pLCAKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNzUpLAogICAgICAgICAgICAgICAgICBmaWxsID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBkX3NwZXZfc3VtICU+JQogICAgICAgICAgICAgIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgMSIpICU+JQogICAgICAgICAgICAgIG11dGF0ZSh5cG9zID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgZ3JlcGwoImNoYXJpc21hdGljIiwgdG9sb3dlcihyZWxpZ2lvbikpIH4gbWVhbiArIHNkICsgMC4wNSwKICAgICAgICAgICAgICAgIFRSVUUgfiBtZWFuIC0gc2QgLSAwLjA1KSksCiAgICAgICAgICAgIGFlcyh5ID0geXBvcywgbGFiZWwgPSBwYXN0ZTAoIm49IiwgbikpLCAKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNzUpLAogICAgICAgICAgICBzaXplID0gMywgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IDIxOjI0KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBndWlkZXMoY29sb3IgPSBGLCBmaWxsID0gRiwgCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoZmlsbCA9ICJibGFjayIpKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgbGFicyh4ID0gIkNvdW50cnkiLCB5ID0gIlNwaXJpdHVhbCBFdmVudHMgc2NvcmUgKHJlc2NhbGVkIHRvIDAtMSkiLAogICAgICAgIyBjYXB0aW9uID0gIkVycm9yIGJhcnMgYXJlIMKxMSBzdGFuZGFyZCBkZXZpYXRpb24gZnJvbSB0aGUgbWVhbiIsCiAgICAgICBzaGFwZSA9ICJSZWxpZ2lvbiIpCmBgYAoKIyMjIFBvcm9zaXR5IHNjb3JlcwoKYGBge3J9CmRfcG9yX3N1bSA8LSBkX2FsbCAlPiUKICBnYXRoZXIocG9yX3NjYWxlLCBwb3Jfc2NvcmUsIGMocHZfc2NvcmUsIHBvcl9zY29yZSkpICU+JQogIG11dGF0ZShwb3Jfc2NhbGUgPSByZWNvZGUocG9yX3NjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2X3Njb3JlIiA9ICJQb3Jvc2l0eSBWaWduZXR0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcl9zY29yZSIgPSAiUG9yb3NpdHkgU2NhbGUiKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShwb3Jfc2NvcmUpKSAlPiUKICBncm91cF9ieShzdHVkeSwgY291bnRyeSwgcmVsaWdpb24sIHBvcl9zY2FsZSkgJT4lCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHBvcl9zY29yZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgc2QgPSBzZChwb3Jfc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgIG4gPSBuKCkpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40NX0KZF9hbGwgJT4lIAogIGdhdGhlcihwb3Jfc2NhbGUsIHBvcl9zY29yZSwgYyhwdl9zY29yZSwgcG9yX3Njb3JlKSkgJT4lCiAgbXV0YXRlKHBvcl9zY2FsZSA9IHJlY29kZShwb3Jfc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHZfc2NvcmUiID0gIlBvcm9zaXR5IFZpZ25ldHRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9yX3Njb3JlIiA9ICJQb3Jvc2l0eSBTY2FsZSIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBvcl9zY29yZSkpICU+JQogIGdncGxvdChhZXMoeCA9IGNvdW50cnksIHkgPSBwb3Jfc2NvcmUsIAogICAgICAgICAgICAgY29sb3IgPSBjb3VudHJ5LCBmaWxsID0gY291bnRyeSwKICAgICAgICAgICAgIGdyb3VwID0gcmVsaWdpb24pKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhzdHVkeSwgcG9yX3NjYWxlKSwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIud2lkdGggPSAwLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci5oZWlnaHQgPSAwLjAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuNzUpLCAKICAgICAgICAgICAgIGFscGhhID0gMC4xNSkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZF9wb3Jfc3VtLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBtZWFuIC0gc2QsIHltYXggPSBtZWFuICsgc2QsIAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSByZWxpZ2lvbiksIAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC43NSksCiAgICAgICAgICAgICAgICAgIGZpbGwgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3RleHQoZGF0YSA9IGRfcG9yX3N1bSAlPiUKICAgICAgICAgICAgICBtdXRhdGUoeXBvcyA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgICAgIGdyZXBsKCJjaGFyaXNtYXRpYyIsIHRvbG93ZXIocmVsaWdpb24pKSB+IG1lYW4gKyBzZCArIDAuMDUsCiAgICAgICAgICAgICAgICBUUlVFIH4gbWVhbiAtIHNkIC0gMC4wNSkpLAogICAgICAgICAgICBhZXMoeSA9IHlwb3MsIGxhYmVsID0gcGFzdGUwKCJuPSIsIG4pKSwgCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjc1KSwKICAgICAgICAgICAgc2l6ZSA9IDMsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSAyMToyNCkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgZ3VpZGVzKGNvbG9yID0gRiwgZmlsbCA9IEYsIAogICAgICAgICBzaGFwZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGZpbGwgPSAiYmxhY2siKSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHggPSAiQ291bnRyeSIsIHkgPSAiUG9yb3NpdHkgc2NvcmUgKHJlc2NhbGVkIHRvIDAtMSkiLAogICAgICAgIyBjYXB0aW9uID0gIkVycm9yIGJhcnMgYXJlIMKxMSBzdGFuZGFyZCBkZXZpYXRpb24gZnJvbSB0aGUgbWVhbiIsCiAgICAgICBzaGFwZSA9ICJSZWxpZ2lvbiIpCmBgYAoKIyMjIEFic29ycHRpb24gc2NvcmVzCgpgYGB7cn0KZF9hYnNfc3VtIDwtIGRfYWxsICU+JQogIGZpbHRlcighaXMubmEoYWJzX3Njb3JlKSkgJT4lCiAgZ3JvdXBfYnkoc3R1ZHksIGNvdW50cnksIHJlbGlnaW9uKSAlPiUKICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oYWJzX3Njb3JlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBzZCA9IHNkKGFic19zY29yZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbiA9IG4oKSkgJT4lCiAgdW5ncm91cCgpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjQ1fQpkX2FsbCAlPiUgCiAgZmlsdGVyKCFpcy5uYShhYnNfc2NvcmUpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5LCB5ID0gYWJzX3Njb3JlLCAKICAgICAgICAgICAgIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnksCiAgICAgICAgICAgICBncm91cCA9IHJlbGlnaW9uKSkgKwogIGZhY2V0X2dyaWQoLiB+IHN0dWR5LCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci53aWR0aCA9IDAuOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLmhlaWdodCA9IDAuMDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMC43NSksIAogICAgICAgICAgICAgYWxwaGEgPSAwLjE1KSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkX2Fic19zdW0sCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IG1lYW4gLSBzZCwgeW1heCA9IG1lYW4gKyBzZCwgCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IHJlbGlnaW9uKSwgCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjc1KSwKICAgICAgICAgICAgICAgICAgZmlsbCA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChkYXRhID0gZF9hYnNfc3VtICU+JQogICAgICAgICAgICAgIG11dGF0ZSh5cG9zID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgZ3JlcGwoImNoYXJpc21hdGljIiwgdG9sb3dlcihyZWxpZ2lvbikpIH4gbWVhbiArIHNkICsgMC4wNSwKICAgICAgICAgICAgICAgIFRSVUUgfiBtZWFuIC0gc2QgLSAwLjA1KSksCiAgICAgICAgICAgIGFlcyh5ID0geXBvcywgbGFiZWwgPSBwYXN0ZTAoIm49IiwgbikpLCAKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNzUpLAogICAgICAgICAgICBzaXplID0gMywgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IDIxOjI0KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBndWlkZXMoY29sb3IgPSBGLCBmaWxsID0gRiwgCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoZmlsbCA9ICJibGFjayIpKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJBYnNvcnB0aW9uIHNjb3JlIChyZXNjYWxlZCB0byAwLTEpIiwKICAgICAgICMgY2FwdGlvbiA9ICJFcnJvciBiYXJzIGFyZSDCsTEgc3RhbmRhcmQgZGV2aWF0aW9uIGZyb20gdGhlIG1lYW4iLAogICAgICAgc2hhcGUgPSAiUmVsaWdpb24iKQpgYGAKCmBgYHtyfQpyMV9zcGV2IDwtIGxtKHNwZXZfc2NvcmVfc3RkIH4gY291bnRyeSwgZDEpCnIxX3B2IDwtIGxtKHB2X3Njb3JlX3N0ZCB+IGNvdW50cnksIGQxKQpyMV9hYnMgPC0gbG0oYWJzX3Njb3JlX3N0ZCB+IGNvdW50cnksIGQxKQoKcjJfc3BldiA8LSBsbShzcGV2X3Njb3JlX3N0ZCB+IGNvdW50cnksIGQyKQpyMl9kc2UgPC0gbG0oZHNlX3Njb3JlX3N0ZCB+IGNvdW50cnksIGQyKQpyMl9hYnMgPC0gbG0oYWJzX3Njb3JlX3N0ZCB+IGNvdW50cnksIGQyKQoKcjNfc3BldiA8LSBsbShzcGlyaXRfc2NvcmVfc3RkIH4gZXBpX2N0cnksIGQzKQpyM19wb3IgPC0gbG0ocG9yX3Njb3JlX3N0ZCB+IGVwaV9jdHJ5LCBkMykKCnI0X3NwZXYgPC0gbG0oc3Bldl9zY29yZV9zdGQgfiBwN19jdHJ5LCBkNCkKcjRfZHNlIDwtIGxtKGRzZV9zY29yZV9zdGQgfiBwN19jdHJ5LCBkNCkKcjRfcG9yIDwtIGxtKHBvcl9zY29yZV9zdGQgfiBwN19jdHJ5LCBkNCkKcjRfcHYgPC0gbG0ocHZfc2NvcmVfc3RkIH4gcDdfY3RyeSwgZDQpCnI0X2FicyA8LSBsbShhYnNfc2NvcmVfc3RkIH4gcDdfY3RyeSwgZDQpCmBgYAoKYGBge3J9CmRmMSA8LSBkYXRhLmZyYW1lKHN0dWR5ID0gInN0dWR5IDEiLAogICAgICAgICAgICAgICAgICB2YXIgPSBjKCJzcGlyaXR1YWwgZXhwZXJpZW5jZSIsICJwb3Jvc2l0eSIsICJhYnNvcnB0aW9uIiksCiAgICAgICAgICAgICAgICAgIHNjYWxlID0gYygic3Bpcml0dWFsIGV2ZW50cyIsICJwb3Jvc2l0eSB2aWduZXR0ZXMiLCAiYWJzb3JwdGlvbiIpLAogICAgICAgICAgICAgICAgICByc3EgPSBjKHJzcXVhcmVkKHIxX3NwZXYpJFIuc3F1YXJlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcnNxdWFyZWQocjFfcHYpJFIuc3F1YXJlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcnNxdWFyZWQocjFfYWJzKSRSLnNxdWFyZWQpKQoKZGYyIDwtIGRhdGEuZnJhbWUoc3R1ZHkgPSAic3R1ZHkgMyIsCiAgICAgICAgICAgICAgICAgIHZhciA9IGMoInNwaXJpdHVhbCBleHBlcmllbmNlIiwgInNwaXJpdHVhbCBleHBlcmllbmNlIiwgImFic29ycHRpb24iKSwKICAgICAgICAgICAgICAgICAgc2NhbGUgPSBjKCJzcGlyaXR1YWwgZXZlbnRzIiwgIkRTRSIsICJhYnNvcnB0aW9uIiksCiAgICAgICAgICAgICAgICAgIHJzcSA9IGMocnNxdWFyZWQocjJfc3BldikkUi5zcXVhcmVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICByc3F1YXJlZChyMl9kc2UpJFIuc3F1YXJlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcnNxdWFyZWQocjJfYWJzKSRSLnNxdWFyZWQpKQoKZGYzIDwtIGRhdGEuZnJhbWUoc3R1ZHkgPSAic3R1ZHkgMiIsCiAgICAgICAgICAgICAgICAgIHZhciA9IGMoInNwaXJpdHVhbCBleHBlcmllbmNlIiwgInBvcm9zaXR5IiksCiAgICAgICAgICAgICAgICAgIHNjYWxlID0gYygic3Bpcml0dWFsIGV2ZW50cyIsICJwb3Jvc2l0eSBzY2FsZSIpLAogICAgICAgICAgICAgICAgICByc3EgPSBjKHJzcXVhcmVkKHIzX3NwZXYpJFIuc3F1YXJlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcnNxdWFyZWQocjNfcG9yKSRSLnNxdWFyZWQpKQoKZGY0IDwtIGRhdGEuZnJhbWUoc3R1ZHkgPSAic3R1ZHkgNCIsCiAgICAgICAgICAgICAgICAgIHZhciA9IGMoInNwaXJpdHVhbCBleHBlcmllbmNlIiwgInNwaXJpdHVhbCBleHBlcmllbmNlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcm9zaXR5IiwgInBvcm9zaXR5IiwgImFic29ycHRpb24iKSwKICAgICAgICAgICAgICAgICAgc2NhbGUgPSBjKCJzcGlyaXR1YWwgZXZlbnRzIiwgIkRTRSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcm9zaXR5IHNjYWxlIiwgInBvcm9zaXR5IHZpZ25ldHRlcyIsICJhYnNvcnB0aW9uIiksCiAgICAgICAgICAgICAgICAgIHJzcSA9IGMocnNxdWFyZWQocjRfc3BldikkUi5zcXVhcmVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICByc3F1YXJlZChyNF9kc2UpJFIuc3F1YXJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICByc3F1YXJlZChyNF9wb3IpJFIuc3F1YXJlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcnNxdWFyZWQocjRfcHYpJFIuc3F1YXJlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcnNxdWFyZWQocjRfYWJzKSRSLnNxdWFyZWQpKQoKZGZfYWxsIDwtIGZ1bGxfam9pbihkZjEsIGRmMikgJT4lIGZ1bGxfam9pbihkZjMpICU+JSBmdWxsX2pvaW4oZGY0KSAlPiUKICBtdXRhdGUodmFyID0gZmFjdG9yKHZhciwgCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJzcGlyaXR1YWwgZXhwZXJpZW5jZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9yb3NpdHkiLCAiYWJzb3JwdGlvbiIpKSkgJT4lCiAgc2VsZWN0KHZhciwgc2NhbGUsIHN0dWR5LCByc3EpICU+JQogIGFycmFuZ2UodmFyLCBzY2FsZSwgc3R1ZHkpCgpkZl9hbGwgJT4lIAogIG11dGF0ZShwZXJjZW50X2V4cCA9IHBhc3RlMChyb3VuZChyc3EgKiAxMDApLCAiJSIpKSAlPiUKICBzZWxlY3QoLXJzcSkgJT4lCiAgc3ByZWFkKHN0dWR5LCBwZXJjZW50X2V4cCkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoInN0dWR5IikpLAogICAgICAgICAgICBmdW5zKGNhc2Vfd2hlbihpcy5uYSguKSB+ICIuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAuKSkpICU+JQogIGthYmxlKCkgJT4lIAogIGthYmxlX3N0eWxpbmcoKSAlPiUKICBjb2xsYXBzZV9yb3dzKDE6MykKYGBgCgpgYGB7cn0KcjFfc3Bldl9wdiA8LSBsbShzcGV2X3Njb3JlX3N0ZCB+IHB2X3Njb3JlX3N0ZCwgZDEpCnIxX3NwZXZfYWJzIDwtIGxtKHNwZXZfc2NvcmVfc3RkIH4gYWJzX3Njb3JlX3N0ZCwgZDEpCgpyMl9zcGV2X2FicyA8LSBsbShzcGV2X3Njb3JlX3N0ZCB+IGFic19zY29yZV9zdGQsIGQyKQpyMl9kc2VfYWJzIDwtIGxtKGRzZV9zY29yZV9zdGQgfiBhYnNfc2NvcmVfc3RkLCBkMikKCnIzX3NwZXZfcG9yIDwtIGxtKHNwaXJpdF9zY29yZV9zdGQgfiBwb3Jfc2NvcmVfc3RkLCBkMykKCnI0X3NwZXZfcG9yIDwtIGxtKHNwZXZfc2NvcmVfc3RkIH4gcG9yX3Njb3JlX3N0ZCwgZDQpCnI0X2RzZV9wb3IgPC0gbG0oZHNlX3Njb3JlX3N0ZCB+IHBvcl9zY29yZV9zdGQsIGQ0KQpyNF9zcGV2X3B2IDwtIGxtKHNwZXZfc2NvcmVfc3RkIH4gcHZfc2NvcmVfc3RkLCBkNCkKcjRfZHNlX3B2IDwtIGxtKGRzZV9zY29yZV9zdGQgfiBwdl9zY29yZV9zdGQsIGQ0KQpyNF9zcGV2X2FicyA8LSBsbShzcGV2X3Njb3JlX3N0ZCB+IGFic19zY29yZV9zdGQsIGQ0KQpyNF9kc2VfYWJzIDwtIGxtKGRzZV9zY29yZV9zdGQgfiBhYnNfc2NvcmVfc3RkLCBkNCkKYGBgCgpgYGB7cn0KZGYxYiA8LSBkYXRhLmZyYW1lKHN0dWR5ID0gInN0dWR5IDEiLAogICAgICAgICAgICAgICAgICAgb3V0Y29tZSA9ICJzcGlyaXR1YWwgZXZlbnRzIiwKICAgICAgICAgICAgICAgICAgIHByZWRpY3RvciA9IGMoInBvcm9zaXR5IHZpZ25ldHRlcyIsICJhYnNvcnB0aW9uIiksCiAgICAgICAgICAgICAgICAgICByc3EgPSBjKHJzcXVhcmVkKHIxX3NwZXZfcHYpJFIuc3F1YXJlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzcXVhcmVkKHIxX3NwZXZfYWJzKSRSLnNxdWFyZWQpKQoKZGYyYiA8LSBkYXRhLmZyYW1lKHN0dWR5ID0gInN0dWR5IDMiLAogICAgICAgICAgICAgICAgICAgb3V0Y29tZSA9IGMoInNwaXJpdHVhbCBldmVudHMiLCAiRFNFIiksCiAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3IgPSAiYWJzb3JwdGlvbiIsCiAgICAgICAgICAgICAgICAgICByc3EgPSBjKHJzcXVhcmVkKHIyX3NwZXZfYWJzKSRSLnNxdWFyZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICByc3F1YXJlZChyMl9kc2VfYWJzKSRSLnNxdWFyZWQpKQoKZGYzYiA8LSBkYXRhLmZyYW1lKHN0dWR5ID0gInN0dWR5IDIiLAogICAgICAgICAgICAgICAgICAgb3V0Y29tZSA9ICJzcGlyaXR1YWwgZXZlbnRzIiwKICAgICAgICAgICAgICAgICAgIHByZWRpY3RvciA9ICJwb3Jvc2l0eSBzY2FsZSIsCiAgICAgICAgICAgICAgICAgICByc3EgPSBjKHJzcXVhcmVkKHIzX3NwZXZfcG9yKSRSLnNxdWFyZWQpKQoKZGY0YiA8LSBkYXRhLmZyYW1lKHN0dWR5ID0gInN0dWR5IDQiLAogICAgICAgICAgICAgICAgICAgb3V0Y29tZSA9IHJlcChjKCJzcGlyaXR1YWwgZXZlbnRzIiwgIkRTRSIpLCAzKSwKICAgICAgICAgICAgICAgICAgIHByZWRpY3RvciA9IGMocmVwKCJwb3Jvc2l0eSBzY2FsZSIsIDIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJwb3Jvc2l0eSB2aWduZXR0ZXMiLCAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJhYnNvcnB0aW9uIiwgMikpLAogICAgICAgICAgICAgICAgICAgcnNxID0gYyhyc3F1YXJlZChyNF9zcGV2X3BvcikkUi5zcXVhcmVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNxdWFyZWQocjRfZHNlX3BvcikkUi5zcXVhcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICByc3F1YXJlZChyNF9zcGV2X3B2KSRSLnNxdWFyZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICByc3F1YXJlZChyNF9kc2VfcHYpJFIuc3F1YXJlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzcXVhcmVkKHI0X3NwZXZfYWJzKSRSLnNxdWFyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzcXVhcmVkKHI0X2RzZV9hYnMpJFIuc3F1YXJlZCkpCgpkZl9hbGxiIDwtIGZ1bGxfam9pbihkZjFiLCBkZjJiKSAlPiUgZnVsbF9qb2luKGRmM2IpICU+JSBmdWxsX2pvaW4oZGY0YikgJT4lCiAgbXV0YXRlKG91dGNvbWUgPSBmYWN0b3Iob3V0Y29tZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJzcGlyaXR1YWwgZXZlbnRzIiwgIkRTRSIpKSwKICAgICAgICAgcHJlZGljdG9yID0gZmFjdG9yKHByZWRpY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInBvcm9zaXR5IHZpZ25ldHRlcyIsICJwb3Jvc2l0eSBzY2FsZSIsICJhYnNvcnB0aW9uIikpKSAlPiUKICBzZWxlY3QocHJlZGljdG9yLCBvdXRjb21lLCBzdHVkeSwgcnNxKSAlPiUKICBhcnJhbmdlKHByZWRpY3Rvciwgb3V0Y29tZSwgc3R1ZHkpCgpkZl9hbGxiICU+JSAKICBmdWxsX2pvaW4oZGZfYWxsICU+JSAKICAgICAgICAgICAgICBmaWx0ZXIodmFyID09ICJzcGlyaXR1YWwgZXhwZXJpZW5jZSIpICU+JQogICAgICAgICAgICAgIHNlbGVjdCgtdmFyKSAlPiUKICAgICAgICAgICAgICByZW5hbWUob3V0Y29tZSA9IHNjYWxlKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUocHJlZGljdG9yID0gImNvdW50cnkiKSkgJT4lCiAgbXV0YXRlKHByZWRpY3RvciA9IGZhY3RvcihwcmVkaWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJjb3VudHJ5IiwgInBvcm9zaXR5IHZpZ25ldHRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3Jvc2l0eSBzY2FsZSIsICJhYnNvcnB0aW9uIikpKSAlPiUKICBtdXRhdGUocGVyY2VudF9leHAgPSBwYXN0ZTAocm91bmQocnNxICogMTAwKSwgIiUiKSkgJT4lCiAgc2VsZWN0KC1yc3EpICU+JQogIHNwcmVhZChzdHVkeSwgcGVyY2VudF9leHApICU+JQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJzdHVkeSIpKSwKICAgICAgICAgICAgZnVucyhjYXNlX3doZW4oaXMubmEoLikgfiAiLiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gLikpKSAlPiUKICBrYWJsZSgpICU+JSAKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgY29sbGFwc2Vfcm93cygxOjIpCmBgYAoKIyMgUmVsYXRpb25zaGlwcwoKIyMjIEFsbCBzdHVkaWVzLCBtdWx0aXBhcnQgcGxvdAoKIyMjIyBTcGlyaXR1YWwgRXZlbnRzIG9ubHksIGNvd3Bsb3QKCmBgYHtyfQpmaWdfczFfcG9yIDwtIGRfYWxsICU+JQogIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgMSIpICU+JQogIGdncGxvdChhZXMoeCA9IHB2X3Njb3JlLCB5ID0gc3Bldl9zY29yZSkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpLCBhbHBoYSA9IDAuMSkgKwogIGdlb21fc21vb3RoKGFlcyhjb2xvciA9IGNvdW50cnkpLCBtZXRob2QgPSAibG0iLCAKICAgICAgICAgICAgICBsdHkgPSAyLCBzaXplID0gMC43LCBhbHBoYSA9IDAsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjcpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB4bGltKDAsIDEpICsKICB5bGltKDAsIDEpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpKSkgKwogIGxhYnMoeCA9ICJQb3Jvc2l0eSBWaWduZXR0ZXMiLAogICAgICAgeSA9ICJTcGlyaXR1YWwgRXZlbnRzIiwKICAgICAgIGNvbG9yID0gIkNvdW50cnkiKQojIGZpZ19zMV9wb3IKCmZpZ19zMV9hYnMgPC0gZF9hbGwgJT4lCiAgZmlsdGVyKHN0dWR5ID09ICJTdHVkeSAxIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWJzX3Njb3JlLCB5ID0gc3Bldl9zY29yZSkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpLCBhbHBoYSA9IDAuMSkgKwogIGdlb21fc21vb3RoKGFlcyhjb2xvciA9IGNvdW50cnkpLCBtZXRob2QgPSAibG0iLCAKICAgICAgICAgICAgICBsdHkgPSAyLCBzaXplID0gMC43LCBhbHBoYSA9IDAsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjcpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB4bGltKDAsIDEpICsKICB5bGltKDAsIDEpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpKSkgKwogIGxhYnMoeCA9ICJBYnNvcnB0aW9uIiwKICAgICAgIHkgPSAiU3Bpcml0dWFsIEV2ZW50cyIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKIyBmaWdfczFfYWJzCmBgYAoKYGBge3J9CmZpZ19zMV90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlNUVURZIDEiLCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMC41KSArCiAgdGhlbWUocGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgMTA1KSkKCmZpZ19zMSA8LSBwbG90X2dyaWQoCiAgZmlnX3MxX3RpdGxlLAogIHBsb3RfZ3JpZChmaWdfczFfcG9yLCBmaWdfczFfYWJzLCBuY29sID0gMSwgbGFiZWxzID0gYygiQSIsICJCIikpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMTApKQojIGZpZ19zMQpgYGAKCmBgYHtyfQpmaWdfczFfdGl0bGVfdmVydCA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlNUVURZIDEiLCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkgKwogIHRoZW1lKHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDcpKQoKZmlnX3MxX3ZlcnQgPC0gcGxvdF9ncmlkKAogIGZpZ19zMV90aXRsZV92ZXJ0LAogIHBsb3RfZ3JpZChmaWdfczFfcG9yLCBmaWdfczFfYWJzLCBuY29sID0gMiwgbGFiZWxzID0gYygiQSIsICJCIikpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMTApKQojIGZpZ19zMV92ZXJ0CmBgYAoKYGBge3J9CmZpZ19zMl9hYnMgPC0gZF9hbGwgJT4lCiAgZmlsdGVyKHN0dWR5ID09ICJTdHVkeSAyIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWJzX3Njb3JlLCB5ID0gc3Bldl9zY29yZSkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpLCBhbHBoYSA9IDAuMSkgKwogIGdlb21fc21vb3RoKGFlcyhjb2xvciA9IGNvdW50cnkpLCBtZXRob2QgPSAibG0iLCAKICAgICAgICAgICAgICBsdHkgPSAyLCBzaXplID0gMC43LCBhbHBoYSA9IDAsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjcpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB4bGltKDAsIDEpICsKICB5bGltKDAsIDEpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpKSkgKwogIGxhYnMoeCA9ICJBYnNvcnB0aW9uIiwKICAgICAgIHkgPSAiU3Bpcml0dWFsIEV2ZW50cyIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKIyBmaWdfczJfYWJzCmBgYAoKYGBge3J9CmZpZ19zMl90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlNUVURZIDMiLCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMC41KSArCiAgdGhlbWUocGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgMTA1KSkKCmZpZ19zMiA8LSBwbG90X2dyaWQoCiAgZmlnX3MyX3RpdGxlLAogIHBsb3RfZ3JpZChOVUxMLCBmaWdfczJfYWJzLCBuY29sID0gMSwgbGFiZWxzID0gYygiIiwgIkMiKSksCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAxMCkpCiMgZmlnX3MyCmBgYAoKYGBge3J9CmZpZ19zMl90aXRsZV92ZXJ0IDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU1RVRFkgMyIsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKSArCiAgdGhlbWUocGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgNykpCgpmaWdfczJfdmVydCA8LSBwbG90X2dyaWQoCiAgZmlnX3MyX3RpdGxlX3ZlcnQsCiAgcGxvdF9ncmlkKE5VTEwsIGZpZ19zMl9hYnMsIG5jb2wgPSAyLCBsYWJlbHMgPSBjKCIiLCAiQyIpKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDEwKSkKIyBmaWdfczJfdmVydApgYGAKCmBgYHtyfQpmaWdfczNfcG9yIDwtIGRfYWxsICU+JQogIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgMyIpICU+JQogIGdncGxvdChhZXMoeCA9IHBvcl9zY29yZSwgeSA9IHNwZXZfc2NvcmUpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb3VudHJ5KSwgYWxwaGEgPSAwLjEpICsKICBnZW9tX3Ntb290aChhZXMoY29sb3IgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxtIiwgCiAgICAgICAgICAgICAgbHR5ID0gMiwgc2l6ZSA9IDAuNywgYWxwaGEgPSAwLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC43KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgeGxpbSgwLCAxKSArCiAgeWxpbSgwLCAxKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpICsKICBsYWJzKHggPSAiUG9yb3NpdHkgU2NhbGUiLAogICAgICAgeSA9ICJTcGlyaXR1YWwgRXZlbnRzIiwKICAgICAgIGNvbG9yID0gIkNvdW50cnkiKQojIGZpZ19zM19wb3IKYGBgCgpgYGB7cn0KZmlnX3MzX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU1RVRFkgMiIsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwLjUpICsKICB0aGVtZShwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAxMDUpKQoKZmlnX3MzIDwtIHBsb3RfZ3JpZCgKICBmaWdfczNfdGl0bGUsCiAgcGxvdF9ncmlkKGZpZ19zM19wb3IsIE5VTEwsIG5jb2wgPSAxLCBsYWJlbHMgPSBjKCJEIiwgIiIpKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDEwKSkKIyBmaWdfczMKYGBgCgpgYGB7cn0KZmlnX3MzX3RpdGxlX3ZlcnQgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTVFVEWSAyIiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApICsKICB0aGVtZShwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCA3KSkKCmZpZ19zM192ZXJ0IDwtIHBsb3RfZ3JpZCgKICBmaWdfczNfdGl0bGVfdmVydCwKICBwbG90X2dyaWQoZmlnX3MzX3BvciwgTlVMTCwgbmNvbCA9IDIsIGxhYmVscyA9IGMoIkQiLCAiIikpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMTApKQojIGZpZ19zM192ZXJ0CmBgYAoKYGBge3J9CmZpZ19zMzJfdmVydCA8LSBwbG90X2dyaWQoCiAgcGxvdF9ncmlkKAogICAgZmlnX3MzX3RpdGxlX3ZlcnQsIAogICAgcGxvdF9ncmlkKGZpZ19zM19wb3IsIGxhYmVscyA9IGMoIkMiKSksIAogICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAxMCkpLAogIHBsb3RfZ3JpZCgKICAgIGZpZ19zMl90aXRsZV92ZXJ0LAogICAgcGxvdF9ncmlkKGZpZ19zMl9hYnMsIGxhYmVscyA9IGMoIkQiKSksIAogICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAxMCkpCikKYGBgCgpgYGB7cn0KZmlnX3M0X3BvcjEgPC0gZF9hbGwgJT4lCiAgZmlsdGVyKHN0dWR5ID09ICJTdHVkeSA0IikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHZfc2NvcmUsIHkgPSBzcGV2X3Njb3JlKSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSksIGFscGhhID0gMC4xKSArCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbG9yID0gY291bnRyeSksIG1ldGhvZCA9ICJsbSIsIAogICAgICAgICAgICAgIGx0eSA9IDIsIHNpemUgPSAwLjcsIGFscGhhID0gMCwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNykgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHhsaW0oMCwgMSkgKwogIHlsaW0oMCwgMSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKSArCiAgbGFicyh4ID0gIlBvcm9zaXR5IFZpZ25ldHRlcyIsCiAgICAgICB5ID0gIlNwaXJpdHVhbCBFdmVudHMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCiMgZmlnX3M0X3BvcjEKCmZpZ19zNF9wb3IyIDwtIGRfYWxsICU+JQogIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgNCIpICU+JQogIGdncGxvdChhZXMoeCA9IHBvcl9zY29yZSwgeSA9IHNwZXZfc2NvcmUpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb3VudHJ5KSwgYWxwaGEgPSAwLjEpICsKICBnZW9tX3Ntb290aChhZXMoY29sb3IgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxtIiwgCiAgICAgICAgICAgICAgbHR5ID0gMiwgc2l6ZSA9IDAuNywgYWxwaGEgPSAwLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC43KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgeGxpbSgwLCAxKSArCiAgeWxpbSgwLCAxKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpICsKICBsYWJzKHggPSAiUG9yb3NpdHkgU2NhbGUiLAogICAgICAgeSA9ICJTcGlyaXR1YWwgRXZlbnRzIiwKICAgICAgIGNvbG9yID0gIkNvdW50cnkiKQojIGZpZ19zNF9wb3IyCgpmaWdfczRfYWJzIDwtIGRfYWxsICU+JQogIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgNCIpICU+JQogIGdncGxvdChhZXMoeCA9IGFic19zY29yZSwgeSA9IHNwZXZfc2NvcmUpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb3VudHJ5KSwgYWxwaGEgPSAwLjEpICsKICBnZW9tX3Ntb290aChhZXMoY29sb3IgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxtIiwgCiAgICAgICAgICAgICAgbHR5ID0gMiwgc2l6ZSA9IDAuNywgYWxwaGEgPSAwLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC43KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgeGxpbSgwLCAxKSArCiAgeWxpbSgwLCAxKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpICsKICBsYWJzKHggPSAiQWJzb3JwdGlvbiIsCiAgICAgICB5ID0gIlNwaXJpdHVhbCBFdmVudHMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCiMgZmlnX3M0X2FicwpgYGAKCmBgYHtyfQpmaWdfczRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTVFVEWSA0IiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDAuNSkgKwogIHRoZW1lKHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDE5MCkpCgpmaWdfczQgPC0gcGxvdF9ncmlkKAogIGZpZ19zNF90aXRsZSwKICBwbG90X2dyaWQocGxvdF9ncmlkKGZpZ19zNF9wb3IxLCBmaWdfczRfcG9yMiwgbmNvbCA9IDIsIGxhYmVscyA9IGMoIkUiLCAiRiIpKSwgCiAgICAgICAgICAgIHBsb3RfZ3JpZChOVUxMLCBmaWdfczRfYWJzLCBOVUxMLCBuY29sID0gMywgcmVsX3dpZHRocyA9IGMoMSwgMiwgMSksIGxhYmVscyA9IGMoIiIsICJHIiwgIiIpKSwgCiAgICAgICAgICAgIG5jb2wgPSAxKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDEwKSkKIyBmaWdfczQKYGBgCgpgYGB7cn0KZmlnX3M0X3RpdGxlX3ZlcnQgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTVFVEWSA0IiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApICsKICB0aGVtZShwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCA3KSkKCmZpZ19zNF92ZXJ0IDwtIHBsb3RfZ3JpZCgKICBmaWdfczRfdGl0bGVfdmVydCwKICBwbG90X2dyaWQocGxvdF9ncmlkKGZpZ19zNF9wb3IxLCBmaWdfczRfcG9yMiwgbmNvbCA9IDEsIGxhYmVscyA9IGMoIkUiLCAiRiIpKSwgCiAgICAgICAgICAgIHBsb3RfZ3JpZChOVUxMLCBmaWdfczRfYWJzLCBOVUxMLCBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDIsIDEpLCBsYWJlbHMgPSBjKCIiLCAiRyIsICIiKSksIAogICAgICAgICAgICBuY29sID0gMiksCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAyMCkpCiMgZmlnX3M0X3ZlcnQKYGBgCgpgYGB7cn0KZmlnX2xlZ2VuZCA8LSBnZXRfbGVnZW5kKGZpZ19zNF9wb3IxICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LjUsIGZpZy5hc3AgPSAwLjR9CmZpZ19hbGwgPC0gcGxvdF9ncmlkKGZpZ19zMSwgZmlnX3MyLCBmaWdfczMsIGZpZ19zNCwgbmNvbCA9IDQsCiAgICAgICAgICAgICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDEsIDEsIDEsIDIpLCBzY2FsZSA9IDAuOTUpCmZpZ19hbGwKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDIuMX0KZmlnX2FsbF92ZXJ0IDwtIHBsb3RfZ3JpZChmaWdfczFfdmVydCwgZmlnX3MzMl92ZXJ0LCBmaWdfczRfdmVydCwgZmlnX2xlZ2VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDEsIDIsIDAuMikpCmZpZ19hbGxfdmVydApgYGAKCgoKCgojIyMjIERhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlcyBvbmx5LCBjb3dwbG90CgpgYGB7cn0KZmlnX3MyX2FicyA8LSBkX2FsbCAlPiUKICBmaWx0ZXIoc3R1ZHkgPT0gIlN0dWR5IDIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhYnNfc2NvcmUsIHkgPSBkc2Vfc2NvcmUpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb3VudHJ5KSwgYWxwaGEgPSAwLjEpICsKICBnZW9tX3Ntb290aChhZXMoY29sb3IgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxtIiwgCiAgICAgICAgICAgICAgbHR5ID0gMiwgc2l6ZSA9IDAuNywgYWxwaGEgPSAwLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC43KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgeGxpbSgwLCAxKSArCiAgeWxpbSgwLCAxKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpICsKICBsYWJzKHggPSAiQWJzb3JwdGlvbiIsCiAgICAgICB5ID0gIkRhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlcyIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKIyBmaWdfczJfYWJzCmBgYAoKYGBge3J9CmZpZ19zMl90aXRsZV92ZXJ0IDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU1RVRFkgMyIsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKSArCiAgdGhlbWUocGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgNykpCgpmaWdfczJfdmVydCA8LSBwbG90X2dyaWQoCiAgZmlnX3MyX3RpdGxlX3ZlcnQsCiAgcGxvdF9ncmlkKGZpZ19zMl9hYnMsIG5jb2wgPSAxLCBsYWJlbHMgPSAiQiIpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMTApKQojIGZpZ19zMl92ZXJ0CmBgYAoKYGBge3J9CmZpZ19zNF9wb3IxIDwtIGRfYWxsICU+JQogIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgNCIpICU+JQogIGdncGxvdChhZXMoeCA9IHB2X3Njb3JlLCB5ID0gZHNlX3Njb3JlKSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSksIGFscGhhID0gMC4xKSArCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbG9yID0gY291bnRyeSksIG1ldGhvZCA9ICJsbSIsIAogICAgICAgICAgICAgIGx0eSA9IDIsIHNpemUgPSAwLjcsIGFscGhhID0gMCwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNykgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHhsaW0oMCwgMSkgKwogIHlsaW0oMCwgMSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKSArCiAgbGFicyh4ID0gIlBvcm9zaXR5IFZpZ25ldHRlcyIsCiAgICAgICB5ID0gIkRhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlcyIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKIyBmaWdfczRfcG9yMQoKZmlnX3M0X3BvcjIgPC0gZF9hbGwgJT4lCiAgZmlsdGVyKHN0dWR5ID09ICJTdHVkeSA0IikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcG9yX3Njb3JlLCB5ID0gZHNlX3Njb3JlKSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSksIGFscGhhID0gMC4xKSArCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbG9yID0gY291bnRyeSksIG1ldGhvZCA9ICJsbSIsIAogICAgICAgICAgICAgIGx0eSA9IDIsIHNpemUgPSAwLjcsIGFscGhhID0gMCwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNykgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHhsaW0oMCwgMSkgKwogIHlsaW0oMCwgMSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKSArCiAgbGFicyh4ID0gIlBvcm9zaXR5IFNjYWxlIiwKICAgICAgIHkgPSAiRGFpbHkgU3Bpcml0dWFsIEV4cGVyaWVuY2VzIiwKICAgICAgIGNvbG9yID0gIkNvdW50cnkiKQojIGZpZ19zNF9wb3IyCgpmaWdfczRfYWJzIDwtIGRfYWxsICU+JQogIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgNCIpICU+JQogIGdncGxvdChhZXMoeCA9IGFic19zY29yZSwgeSA9IGRzZV9zY29yZSkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpLCBhbHBoYSA9IDAuMSkgKwogIGdlb21fc21vb3RoKGFlcyhjb2xvciA9IGNvdW50cnkpLCBtZXRob2QgPSAibG0iLCAKICAgICAgICAgICAgICBsdHkgPSAyLCBzaXplID0gMC43LCBhbHBoYSA9IDAsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjcpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB4bGltKDAsIDEpICsKICB5bGltKDAsIDEpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpKSkgKwogIGxhYnMoeCA9ICJBYnNvcnB0aW9uIiwKICAgICAgIHkgPSAiRGFpbHkgU3Bpcml0dWFsIEV4cGVyaWVuY2VzIiwKICAgICAgIGNvbG9yID0gIkNvdW50cnkiKQojIGZpZ19zNF9hYnMKYGBgCgpgYGB7cn0KZmlnX3M0X3RpdGxlX3ZlcnQgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTVFVEWSA0IiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApICsKICB0aGVtZShwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCA3KSkKCmZpZ19zNF9wb3IxX3ZlcnQgPC0gcGxvdF9ncmlkKAogIGZpZ19zNF90aXRsZV92ZXJ0LAogIHBsb3RfZ3JpZChmaWdfczRfcG9yMSwgbmNvbCA9IDEsIGxhYmVscyA9ICJBIiksCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAxMCkpCiMgZmlnX3M0X3BvcjFfdmVydAoKZmlnX3M0X3BvcjJfdmVydCA8LSBwbG90X2dyaWQoCiAgZmlnX3M0X3RpdGxlX3ZlcnQsCiAgcGxvdF9ncmlkKGZpZ19zNF9wb3IyLCBuY29sID0gMSwgbGFiZWxzID0gIkMiKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDEwKSkKIyBmaWdfczRfcG9yMl92ZXJ0CgpmaWdfczRfYWJzX3ZlcnQgPC0gcGxvdF9ncmlkKAogIGZpZ19zNF90aXRsZV92ZXJ0LAogIHBsb3RfZ3JpZChmaWdfczRfYWJzLCBuY29sID0gMSwgbGFiZWxzID0gIkQiKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDEwKSkKIyBmaWdfczRfYWJzX3ZlcnQKYGBgCgpgYGB7cn0KZmlnX2xlZ2VuZCA8LSBnZXRfbGVnZW5kKGZpZ19zNF9wb3IxICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMS4yfQpmaWdfYWxsX3ZlcnQgPC0gcGxvdF9ncmlkKAogIHBsb3RfZ3JpZChmaWdfczRfcG9yMV92ZXJ0LCBmaWdfczJfdmVydCwgCiAgICAgICAgICAgIGZpZ19zNF9wb3IyX3ZlcnQsIGZpZ19zNF9hYnNfdmVydCwKICAgICAgICAgICAgbmNvbCA9IDIpLAogIGZpZ19sZWdlbmQsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygyLCAwLjIpKQpmaWdfYWxsX3ZlcnQKYGBgCgoKIyMjIE90aGVyIHZlcnNpb25zCgojIyMjIFNwaXJpdHVhbCBFdmVudHMgb25seSwgb25lIGdyaWQsIG5ldyBsYXlvdXQKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC43fQpkX2FsbCAlPiUKICBnYXRoZXIoc3Bpcml0X3NjYWxlLCBzcGV2X3Njb3JlLCBjKHNwZXZfc2NvcmUsIGRzZV9zY29yZSkpICU+JQogIGdhdGhlcihwcmVkX3NjYWxlLCBwcmVkX3Njb3JlLCBjKHBvcl9zY29yZSwgcHZfc2NvcmUsIGFic19zY29yZSkpICU+JQogIG11dGF0ZShzcGlyaXRfc2NhbGUgPSByZWNvZGVfZmFjdG9yKHNwaXJpdF9zY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3Bldl9zY29yZSIgPSAiU3Bpcml0dWFsIEV2ZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzZV9zY29yZSIgPSAiRGFpbHkgU3Bpcml0dWFsIEV4cGVyaWVuY2VzIiksCiAgICAgICAgIHByZWRfc2NhbGUgPSByZWNvZGVfZmFjdG9yKHByZWRfc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdl9zY29yZSIgPSAiUG9yb3NpdHkgVmlnbmV0dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcl9zY29yZSIgPSAiUG9yb3NpdHkgU2NhbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJzX3Njb3JlIiA9ICJBYnNvcnB0aW9uIiksCiAgICAgICAgIHByZWRfdHlwZSA9IGNhc2Vfd2hlbihwcmVkX3NjYWxlID09ICJBYnNvcnB0aW9uIiB+ICJBYnNvcnB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJQb3Jvc2l0eSIsIHByZWRfc2NhbGUpIH4gIlBvcm9zaXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwKICAgICAgICAgcHJlZF90eXBlID0gZmFjdG9yKHByZWRfdHlwZSwgbGV2ZWxzID0gYygiUG9yb3NpdHkiLCAiQWJzb3JwdGlvbiIpKSwKICAgICAgICAgc3R1ZHlfc2NhbGUgPSBwYXN0ZShzdHVkeSwgcHJlZF9zY2FsZSwgc2VwID0gIjogIiksCiAgICAgICAgIHN0dWR5X3NjYWxlMiA9IGNhc2Vfd2hlbigKICAgICAgICAgICBzdHVkeSA9PSAiU3R1ZHkgNCIgICYgcHJlZF9zY2FsZSAhPSAiQWJzb3JwdGlvbiIgfiAKICAgICAgICAgICAgIHBhc3RlKHN0dWR5LCBwcmVkX3NjYWxlLCBzZXAgPSAiOiAiKSwKICAgICAgICAgICBUUlVFIH4gc3R1ZHkpLAogICAgICAgICBzdHVkeV9zY2FsZTMgPSBjYXNlX3doZW4oCiAgICAgICAgICAgc3R1ZHkgPT0gIlN0dWR5IDQiICYgcHJlZF9zY2FsZSA9PSAiUG9yb3NpdHkgU2NhbGUiIH4gIlBvcm9zaXR5IFNjYWxlIiwKICAgICAgICAgICBzdHVkeSAlaW4lIGMoIlN0dWR5IDEiLCAiU3R1ZHkgNCIpIH4gIlBvcm9zaXR5IFZpZ25ldHRlcyIsCiAgICAgICAgICAgc3R1ZHkgPT0gIlN0dWR5IDIiIH4gIlBvcm9zaXR5IFNjYWxlIiwgCiAgICAgICAgICAgVFJVRSB+ICIgIiksCiAgICAgICAgIHN0dWR5X3NjYWxlMyA9IGZhY3RvcihzdHVkeV9zY2FsZTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJQb3Jvc2l0eSBWaWduZXR0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9yb3NpdHkgU2NhbGUiLCAiICIpKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShwcmVkX3Njb3JlKSwKICAgICAgICAgc3Bpcml0X3NjYWxlID09ICJTcGlyaXR1YWwgRXZlbnRzIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJlZF9zY29yZSwgeSA9IHNwZXZfc2NvcmUpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhwcmVkX3R5cGUpLCBjb2xzID0gdmFycyhzdHVkeSwgc3R1ZHlfc2NhbGUzKSkgKwogICMgZmFjZXRfZ3JpZChwcmVkX3R5cGUgfiBzdHVkeV9zY2FsZTMpICsKICBnZW9tX3BvaW50KGRhdGEgPSAuICU+JSBkaXN0aW5jdChzdHVkeSwgc3R1ZHlfc2NhbGUzLCBjb3VudHJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkX3R5cGUsIHByZWRfc2NhbGUsIHByZWRfc2NvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpcml0X3NjYWxlLCBzcGV2X3Njb3JlKSwKICAgICAgICAgICAgIGFlcyhjb2xvciA9IGNvdW50cnkpLCBhbHBoYSA9IDAuMSkgKwogIGdlb21fc21vb3RoKGFlcyhjb2xvciA9IGNvdW50cnkpLCBtZXRob2QgPSAibG0iLCAKICAgICAgICAgICAgICBsdHkgPSAyLCBzaXplID0gMC43LCBhbHBoYSA9IDAsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjcpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpICsKICBsYWJzKHggPSAiU2NvcmUgb24gcHJlZGljdG9yIHNjYWxlIChQb3Jvc2l0eSBWaWduZXR0ZXMsIFBvcm9zaXR5IFNjYWxlLCBvciBBYnNvcnB0aW9uOyByZXNjYWxlZCB0byAwLTEpIiwKICAgICAgIHkgPSAiU2NvcmUgb24gU3Bpcml0dWFsIEV2ZW50cyAocmVzY2FsZWQgdG8gMC0xKSIsCiAgICAgICAjIGNhcHRpb24gPSAiU29saWQgYmxhY2sgbGluZXMgY29ycmVzcG9uZCB0byB0byB0aGUgb3ZlcmFsbCB0cmVuZCwgY29sbGFwc2luZyBhY3Jvc3MgY291bnRyaWVzIiwKICAgICAgIGNvbG9yID0gIkNvdW50cnkiKQpgYGAKCiMjIyMgU3Bpcml0dWFsIEV2ZW50cyBvbmx5LCBieSBzdHVkeQoKYGBge3IsIGZpZy53aWR0aCA9IDEuNSwgZmlnLmFzcCA9IDJ9CmZpZ19zMSA8LSBkX2FsbCAlPiUKICBmaWx0ZXIoc3R1ZHkgPT0gIlN0dWR5IDEiKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGdhdGhlcihwcmVkX3NjYWxlLCBwcmVkX3Njb3JlLCBjKHB2X3Njb3JlLCBwb3Jfc2NvcmUsIGFic19zY29yZSkpICU+JQogIG11dGF0ZShwcmVkX3NjYWxlID0gcmVjb2RlX2ZhY3RvcihwcmVkX3NjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHZfc2NvcmUiID0gIlBvcm9zaXR5IFZpZ25ldHRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3Jfc2NvcmUiID0gIlBvcm9zaXR5IFNjYWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFic19zY29yZSIgPSAiQWJzb3JwdGlvbiIpKSAlPiUKICAjIG11dGF0ZShzdHVkeV9zY2FsZSA9IHBhc3RlKHN0dWR5LCBwcmVkX3NjYWxlLCBzZXAgPSAiOiAiKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShwcmVkX3Njb3JlKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJlZF9zY29yZSwgeSA9IHNwZXZfc2NvcmUpKSArCiAgZmFjZXRfZ3JpZChwcmVkX3NjYWxlIH4gc3R1ZHkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpLCBhbHBoYSA9IDAuMSkgKwogIGdlb21fc21vb3RoKGFlcyhjb2xvciA9IGNvdW50cnkpLCBtZXRob2QgPSAibG0iLAogICAgICAgICAgICAgIGx0eSA9IDIsIHNpemUgPSAwLjcsIGFscGhhID0gMCwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNykgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogICMgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIAogICMgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgIyBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpKSkgKwogIGd1aWRlcyhjb2xvciA9IEYpICsKICBsYWJzKHggPSAiU2NvcmUgb24gcHJlZGljdG9yIHNjYWxlXG4ocG9yb3NpdHkgb3IgYWJzb3JwdGlvbjsgcmVzY2FsZWQgdG8gMC0xKSIsCiAgICAgICB5ID0gIlNjb3JlIG9uIFNwaXJpdHVhbCBFdmVudHMgc2NhbGUgKHJlc2NhbGVkIHRvIDAtMSkiLAogICAgICAgIyBjYXB0aW9uID0gIlNvbGlkIGJsYWNrIGxpbmVzIGNvcnJlc3BvbmQgdG8gdG8gdGhlIG92ZXJhbGwgdHJlbmQsIGNvbGxhcHNpbmcgYWNyb3NzIGNvdW50cmllcyIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMS41LCBmaWcuYXNwID0gMn0KZmlnX3MyIDwtIGRfYWxsICU+JQogIGZpbHRlcihzdHVkeSA9PSAiU3R1ZHkgMiIpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZ2F0aGVyKHByZWRfc2NhbGUsIHByZWRfc2NvcmUsIGMocHZfc2NvcmUsIHBvcl9zY29yZSwgYWJzX3Njb3JlKSkgJT4lCiAgbXV0YXRlKHByZWRfc2NhbGUgPSByZWNvZGVfZmFjdG9yKHByZWRfc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdl9zY29yZSIgPSAiUG9yb3NpdHkgVmlnbmV0dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcl9zY29yZSIgPSAiUG9yb3NpdHkgU2NhbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJzX3Njb3JlIiA9ICJBYnNvcnB0aW9uIikpICU+JQogICMgbXV0YXRlKHN0dWR5X3NjYWxlID0gcGFzdGUoc3R1ZHksIHByZWRfc2NhbGUsIHNlcCA9ICI6ICIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHByZWRfc2NvcmUpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwcmVkX3Njb3JlLCB5ID0gc3Bldl9zY29yZSkpICsKICBmYWNldF9ncmlkKHByZWRfc2NhbGUgfiBzdHVkeSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSksIGFscGhhID0gMC4xKSArCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbG9yID0gY291bnRyeSksIG1ldGhvZCA9ICJsbSIsCiAgICAgICAgICAgICAgbHR5ID0gMiwgc2l6ZSA9IDAuNywgYWxwaGEgPSAwLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC43KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgIyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgIyAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICAjIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKSArCiAgZ3VpZGVzKGNvbG9yID0gRikgKwogIGxhYnMoeCA9ICJTY29yZSBvbiBwcmVkaWN0b3Igc2NhbGVcbihwb3Jvc2l0eSBvciBhYnNvcnB0aW9uOyByZXNjYWxlZCB0byAwLTEpIiwKICAgICAgIHkgPSAiU2NvcmUgb24gU3Bpcml0dWFsIEV2ZW50cyBzY2FsZSAocmVzY2FsZWQgdG8gMC0xKSIsCiAgICAgICAjIGNhcHRpb24gPSAiU29saWQgYmxhY2sgbGluZXMgY29ycmVzcG9uZCB0byB0byB0aGUgb3ZlcmFsbCB0cmVuZCwgY29sbGFwc2luZyBhY3Jvc3MgY291bnRyaWVzIiwKICAgICAgIGNvbG9yID0gIkNvdW50cnkiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAxLjUsIGZpZy5hc3AgPSAyfQpmaWdfczMgPC0gZF9hbGwgJT4lCiAgZmlsdGVyKHN0dWR5ID09ICJTdHVkeSAzIikgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBnYXRoZXIocHJlZF9zY2FsZSwgcHJlZF9zY29yZSwgYyhwdl9zY29yZSwgcG9yX3Njb3JlLCBhYnNfc2NvcmUpKSAlPiUKICBtdXRhdGUocHJlZF9zY2FsZSA9IHJlY29kZV9mYWN0b3IocHJlZF9zY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2X3Njb3JlIiA9ICJQb3Jvc2l0eSBWaWduZXR0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9yX3Njb3JlIiA9ICJQb3Jvc2l0eSBTY2FsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYnNfc2NvcmUiID0gIkFic29ycHRpb24iKSkgJT4lCiAgIyBtdXRhdGUoc3R1ZHlfc2NhbGUgPSBwYXN0ZShzdHVkeSwgcHJlZF9zY2FsZSwgc2VwID0gIjogIikpICU+JQogIGZpbHRlcighaXMubmEocHJlZF9zY29yZSkpICU+JQogIGdncGxvdChhZXMoeCA9IHByZWRfc2NvcmUsIHkgPSBzcGV2X3Njb3JlKSkgKwogIGZhY2V0X2dyaWQocHJlZF9zY2FsZSB+IHN0dWR5KSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb3VudHJ5KSwgYWxwaGEgPSAwLjEpICsKICBnZW9tX3Ntb290aChhZXMoY29sb3IgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxtIiwKICAgICAgICAgICAgICBsdHkgPSAyLCBzaXplID0gMC43LCBhbHBoYSA9IDAsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjcpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICAjIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCAKICAjICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogICMgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpICsKICBndWlkZXMoY29sb3IgPSBGKSArCiAgbGFicyh4ID0gIlNjb3JlIG9uIHByZWRpY3RvciBzY2FsZVxuKHBvcm9zaXR5IG9yIGFic29ycHRpb247IHJlc2NhbGVkIHRvIDAtMSkiLAogICAgICAgeSA9ICJTY29yZSBvbiBTcGlyaXR1YWwgRXZlbnRzIHNjYWxlIChyZXNjYWxlZCB0byAwLTEpIiwKICAgICAgICMgY2FwdGlvbiA9ICJTb2xpZCBibGFjayBsaW5lcyBjb3JyZXNwb25kIHRvIHRvIHRoZSBvdmVyYWxsIHRyZW5kLCBjb2xsYXBzaW5nIGFjcm9zcyBjb3VudHJpZXMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDEuNSwgZmlnLmFzcCA9IDJ9CmZpZ19zNCA8LSBkX2FsbCAlPiUKICBmaWx0ZXIoc3R1ZHkgPT0gIlN0dWR5IDQiKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGdhdGhlcihwcmVkX3NjYWxlLCBwcmVkX3Njb3JlLCBjKHB2X3Njb3JlLCBwb3Jfc2NvcmUsIGFic19zY29yZSkpICU+JQogIG11dGF0ZShwcmVkX3NjYWxlID0gcmVjb2RlX2ZhY3RvcihwcmVkX3NjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHZfc2NvcmUiID0gIlBvcm9zaXR5IFZpZ25ldHRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3Jfc2NvcmUiID0gIlBvcm9zaXR5IFNjYWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFic19zY29yZSIgPSAiQWJzb3JwdGlvbiIpKSAlPiUKICAjIG11dGF0ZShzdHVkeV9zY2FsZSA9IHBhc3RlKHN0dWR5LCBwcmVkX3NjYWxlLCBzZXAgPSAiOiAiKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShwcmVkX3Njb3JlKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJlZF9zY29yZSwgeSA9IHNwZXZfc2NvcmUpKSArCiAgZmFjZXRfZ3JpZChwcmVkX3NjYWxlIH4gc3R1ZHkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpLCBhbHBoYSA9IDAuMSkgKwogIGdlb21fc21vb3RoKGFlcyhjb2xvciA9IGNvdW50cnkpLCBtZXRob2QgPSAibG0iLAogICAgICAgICAgICAgIGx0eSA9IDIsIHNpemUgPSAwLjcsIGFscGhhID0gMCwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNykgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogICMgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIAogICMgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgIyBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpKSkgKwogIGd1aWRlcyhjb2xvciA9IEYpICsKICBsYWJzKHggPSAiU2NvcmUgb24gcHJlZGljdG9yIHNjYWxlXG4ocG9yb3NpdHkgb3IgYWJzb3JwdGlvbjsgcmVzY2FsZWQgdG8gMC0xKSIsCiAgICAgICB5ID0gIlNjb3JlIG9uIFNwaXJpdHVhbCBFdmVudHMgc2NhbGUgKHJlc2NhbGVkIHRvIDAtMSkiLAogICAgICAgIyBjYXB0aW9uID0gIlNvbGlkIGJsYWNrIGxpbmVzIGNvcnJlc3BvbmQgdG8gdG8gdGhlIG92ZXJhbGwgdHJlbmQsIGNvbGxhcHNpbmcgYWNyb3NzIGNvdW50cmllcyIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKYGBgCgojIyMjIFNwaXJpdHVhbCBFdmVudHMgb25seSwgZnVsbCBncmlkCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuOH0KZF9hbGwgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBnYXRoZXIocHJlZF9zY2FsZSwgcHJlZF9zY29yZSwgYyhwdl9zY29yZSwgcG9yX3Njb3JlLCBhYnNfc2NvcmUpKSAlPiUKICBtdXRhdGUocHJlZF9zY2FsZSA9IHJlY29kZV9mYWN0b3IocHJlZF9zY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2X3Njb3JlIiA9ICJQb3Jvc2l0eSBWaWduZXR0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9yX3Njb3JlIiA9ICJQb3Jvc2l0eSBTY2FsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYnNfc2NvcmUiID0gIkFic29ycHRpb24iKSkgJT4lCiAgIyBtdXRhdGUoc3R1ZHlfc2NhbGUgPSBwYXN0ZShzdHVkeSwgcHJlZF9zY2FsZSwgc2VwID0gIjogIikpICU+JQogIGZpbHRlcighaXMubmEocHJlZF9zY29yZSkpICU+JQogIGdncGxvdChhZXMoeCA9IHByZWRfc2NvcmUsIHkgPSBzcGV2X3Njb3JlKSkgKwogIGZhY2V0X2dyaWQocHJlZF9zY2FsZSB+IHN0dWR5KSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb3VudHJ5KSwgYWxwaGEgPSAwLjEpICsKICBnZW9tX3Ntb290aChhZXMoY29sb3IgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxtIiwKICAgICAgICAgICAgICBsdHkgPSAyLCBzaXplID0gMC43LCBhbHBoYSA9IDAsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjcpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICAjIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCAKICAjICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogICMgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpICsKICBndWlkZXMoY29sb3IgPSBGKSArCiAgbGFicyh4ID0gIlNjb3JlIG9uIHByZWRpY3RvciBzY2FsZVxuKHBvcm9zaXR5IG9yIGFic29ycHRpb247IHJlc2NhbGVkIHRvIDAtMSkiLAogICAgICAgeSA9ICJTY29yZSBvbiBTcGlyaXR1YWwgRXZlbnRzIHNjYWxlIChyZXNjYWxlZCB0byAwLTEpIiwKICAgICAgICMgY2FwdGlvbiA9ICJTb2xpZCBibGFjayBsaW5lcyBjb3JyZXNwb25kIHRvIHRvIHRoZSBvdmVyYWxsIHRyZW5kLCBjb2xsYXBzaW5nIGFjcm9zcyBjb3VudHJpZXMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCmBgYAoKIyMjIyBCcm9rZW4gZG93biBieSBwcmVkaWN0b3IgdHlwZSBhbmQgc3Bpcml0dWFsIHNjYWxlCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuN30KZF9hbGwgJT4lCiAgZ2F0aGVyKHNwaXJpdF9zY2FsZSwgc3Bldl9zY29yZSwgYyhzcGV2X3Njb3JlLCBkc2Vfc2NvcmUpKSAlPiUKICBnYXRoZXIocG9yb3Nfc2NhbGUsIHBvcm9zX3Njb3JlLCBjKHBvcl9zY29yZSwgcHZfc2NvcmUpKSAlPiUKICBtdXRhdGUoc3Bpcml0X3NjYWxlID0gcmVjb2RlX2ZhY3RvcihzcGlyaXRfc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZXZfc2NvcmUiID0gIlNwaXJpdHVhbCBFdmVudHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc2Vfc2NvcmUiID0gIkRhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlcyIpLAogICAgICAgICBwb3Jvc19zY2FsZSA9IHJlY29kZV9mYWN0b3IocG9yb3Nfc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHZfc2NvcmUiID0gIlBvcm9zaXR5IFZpZ25ldHRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9yX3Njb3JlIiA9ICJQb3Jvc2l0eSBTY2FsZSIpLAogICAgICAgICBzdHVkeV9zY2FsZSA9IHBhc3RlKHN0dWR5LCBwb3Jvc19zY2FsZSwgc2VwID0gIjogIikpICU+JQogIGZpbHRlcighaXMubmEocG9yb3Nfc2NvcmUpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwb3Jvc19zY29yZSwgeSA9IHNwZXZfc2NvcmUpKSArCiAgZmFjZXRfZ3JpZChzcGlyaXRfc2NhbGUgfiBzdHVkeV9zY2FsZSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IC4gJT4lIGRpc3RpbmN0KHN0dWR5LCBzdHVkeV9zY2FsZSwgY291bnRyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9yb3Nfc2NhbGUsIHBvcm9zX3Njb3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaXJpdF9zY2FsZSwgc3Bldl9zY29yZSksCiAgICAgICAgICAgICBhZXMoY29sb3IgPSBjb3VudHJ5KSwgYWxwaGEgPSAwLjEpICsKICBnZW9tX3Ntb290aChhZXMoY29sb3IgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxtIiwgCiAgICAgICAgICAgICAgbHR5ID0gMiwgc2l6ZSA9IDAuNywgYWxwaGEgPSAwLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC43KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKSArCiAgbGFicyh4ID0gIlNjb3JlIG9uIHBvcm9zaXR5IG1lYXN1cmUgKHJlc2NhbGVkIHRvIDAtMSkiLAogICAgICAgeSA9ICJTY29yZSBvbiBzcGlyaXR1YWwgZXhwZXJpZW5jZSBtZWFzdXJlIChyZXNjYWxlZCB0byAwLTEpIiwKICAgICAgICMgY2FwdGlvbiA9ICJTb2xpZCBibGFjayBsaW5lcyBjb3JyZXNwb25kIHRvIHRvIHRoZSBvdmVyYWxsIHRyZW5kLCBjb2xsYXBzaW5nIGFjcm9zcyBjb3VudHJpZXMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAwLjl9CmRfYWxsICU+JQogIGdhdGhlcihzcGlyaXRfc2NhbGUsIHNwZXZfc2NvcmUsIGMoc3Bldl9zY29yZSwgZHNlX3Njb3JlKSkgJT4lCiAgbXV0YXRlKHNwaXJpdF9zY2FsZSA9IHJlY29kZV9mYWN0b3Ioc3Bpcml0X3NjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGV2X3Njb3JlIiA9ICJTcGlyaXR1YWwgRXZlbnRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHNlX3Njb3JlIiA9ICJEYWlseSBTcGlyaXR1YWwgRXhwZXJpZW5jZXMiKSwKICAgICAgICAgc3R1ZHlfc2NhbGUgPSBwYXN0ZShzdHVkeSwgIkFic29ycHRpb24gc2NhbGUiLCBzZXAgPSAiOiAiKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShhYnNfc2NvcmUpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhYnNfc2NvcmUsIHkgPSBzcGV2X3Njb3JlKSkgKwogIGZhY2V0X2dyaWQoc3Bpcml0X3NjYWxlIH4gc3R1ZHlfc2NhbGUpICsKICBnZW9tX3BvaW50KGRhdGEgPSAuICU+JSBkaXN0aW5jdChzdHVkeSwgc3R1ZHlfc2NhbGUsIGNvdW50cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic19zY29yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGlyaXRfc2NhbGUsIHNwZXZfc2NvcmUpLAogICAgICAgICAgICAgYWVzKGNvbG9yID0gY291bnRyeSksIGFscGhhID0gMC4yKSArCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbG9yID0gY291bnRyeSksIG1ldGhvZCA9ICJsbSIsIAogICAgICAgICAgICAgIGx0eSA9IDIsIHNpemUgPSAwLjcsIGFscGhhID0gMCwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNykgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCAKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpKSkgKwogIGxhYnMoeCA9ICJTY29yZSBvbiBhYnNvcnB0aW9uIG1lYXN1cmUgKHJlc2NhbGVkIHRvIDAtMSkiLAogICAgICAgeSA9ICJTY29yZSBvbiBzcGlyaXR1YWwgZXhwZXJpZW5jZSBtZWFzdXJlIChyZXNjYWxlZCB0byAwLTEpIiwKICAgICAgICMgY2FwdGlvbiA9ICJTb2xpZCBibGFjayBsaW5lcyBjb3JyZXNwb25kIHRvIHRvIHRoZSBvdmVyYWxsIHRyZW5kLCBjb2xsYXBzaW5nIGFjcm9zcyBjb3VudHJpZXMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCmBgYAoKCiMgSGlzdG9ncmFtcyBvZiBhYnNvcnB0aW9uCgojIyBTdHVkeSAxCgpgYGB7ciwgZmlnLndpZHRoID0gNn0KZ2dwbG90KGRfYWxsICU+JSBmaWx0ZXIoc3R1ZHkgIT0gIlN0dWR5IDMiKSwgCiAgICAgICBhZXMoeCA9IGFic19zY29yZSAqIDM0KSkgKwogIGZhY2V0X2dyaWQoc3R1ZHkgfiBjb3VudHJ5LCBzY2FsZXMgPSAiZnJlZV95IikgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMzQsIDUpKSArCiAgbGFicyh4ID0gIkFic29ycHRpb24gc2NvcmUgKHJhbmdlOiAwLTM0KSIsIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmRfc3VtX2FicyA8LSBkX2FsbCAlPiUKICBmaWx0ZXIoc3R1ZHkgIT0gIlN0dWR5IDMiKSAlPiUKICBncm91cF9ieShzdHVkeSwgY291bnRyeSwgcmVsaWdpb24pICU+JQogIG11dGF0ZShhYnNfc2NvcmUgPSBhYnNfc2NvcmUgKiAzNCkgJT4lCiAgc3VtbWFyaXNlX2F0KHZhcnMoYWJzX3Njb3JlKSwKICAgICAgICAgICAgICAgZnVucyhtZWFuID0gbWVhbiguLCBuYS5ybSA9IFQpLCBzZCA9IHNkKC4sIG5hLnJtID0gVCkpKSAlPiUKICB1bmdyb3VwKCkKYGBgCgpgYGB7cn0KZF9zdW1fYWJzICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpCmBgYAoK